プログラミング言語 C

基本に もどって、ちょっと 復習 ...

C においては、ポインタと 配列との間に 強い 関係がある。 この関係が 強いので、ポインタと 配列とは 同時に 論じなければならない。

a[i] という 記法は、(ブロックの) 先頭から i番目の 位置の 配列要素を 参照する。 pa が 整数のポインタだとすると、

int *pa;

と 宣言され、代入

pa = &a[0];

によって a の 0番目の要素を 指すように pa が セットされる。 つまり pa は a[0] の アドレスを 内容とする。

これで 代入文

x = *pa;

により a[0] の 内容が x に コピーされることになる。

pa が a[0] を 指すとすると、

*(pa + 1)

は a[1] の 内容を 参照する。

これらの説明は、配列 a の 変数の型や サイズに かかわらず あてはまる。「1 を ポインタに 加える」ことや、その拡張である すべての ポインタ演算の 意味は、pa + 1 は (pa の) 次の オブジェクトを 指し、pa + i は pa の 先の i番目の オブジェクトを 指す ということである。

定義により、配列型の 変数あるいは 式の値は、配列の 0番目の 要素の番地である。 そこで、代入

pa = &a[0];

の後では、pa は a と 同じ値を もつ。 配列の名前は その先頭の 要素の位置と 同義であるから、(上の) 代入式は 次のようにも 書ける。

pa = a;

a[i] の 計算において C では それは ただちに *(a + i) に 変換される。 この 2つの形は まったく 同等である。 この等式*1の 両辺に &演算子を 適用すると、&a[i] と a + i とは 同じだと いうことになる。 a + i は a の後の i番目の アドレスである。

これを 裏返して いうと、pa が ポインタであるとき、式の中では 添字を 使ってもよい ということになる。 (p119-120)

*1: a[i] == *(a + i)