C言語をそこそこ使い慣れてきた人も、以下のプログラムを見て面食らうだろう。
----
#include <stdio.h>
int main( void )
{
int iLoop = 0;
int iArray[5] = {0};
for( iLoop = 0; iLoop < 5; iLoop++ ){
iArray[iLoop] = iLoop + 1;
}
for( iLoop = 0; iLoop < 5; iLoop++ ){
printf( "%d\n", iLoop[iArray] );
}
return 0;
}
----
コンパイル通してもいない机上のコードだから、どっか誤記ってたらスマン
さて、何てことない、単に配列に1~5を突っ込んで、ループで内容を表示しているだけのプログラム。
あえて、1~5を入れる部分を初期化じゃなくてループで表現しているんだけど、最初のループでは
iArray[iLoop]
と記述しているのに、次のループでは
iLoop[iArray]
と記述しているところ。
もちろん、普通はこんなことしないし、しちゃいけないし、すれば即刻直されるだけ。
しかし、文法的にも処理的にも間違ってはいないのだ。
絶対変だと思う。
だって、iLoopなんていう配列なんて作っていないのに、iLoop[添え字]という表現が出来てしまうんだから。
これは、
変数[添え字]
という配列の要素の中身を指す際、
*( 変数 + 添え字 )
という書き方が原点であるわけだが、そもそも [ ] の存在は、配列変数の何番目とか全然関係なく、単なるシンタックスシュガー(人間にとって分かりやすく表現できるようにした仕様)だからである。
*( 変数 + 添え字 )
という内容は、
*( 添え字 + 変数 )
と同じこととなり、故に
添え字[変数]
という書き方も可能ということである。
つまり、例えば
iArray[4]
とか書くところを、
4[iArray]
と書いてもちゃんとコンパイル通るし、処理だったちゃんと動く。
繰り返し言うが、こんな書き方はしないし、してもいけないし、したら即刻直されるw
こんな書き方するわけないんだけど、配列用の変数というのが、そもそもポインタと何ら変わらない存在であり、そして配列要素を指す際にきちんとポインタを理解しておく必要があるということだ。
配列として宣言した変数というのは、あくまで最初からバッファが確保された領域を指しているポインタ変数だと思っておくといいだろう。