配列の要素のアドレス
配列とポインタは密接な関係がある。下記の例では、配列arrayにはint型の値を3つ入れることができる。
int array[3] = {10,20,30};
インデックスに0を指定して、
array[0]
とすると、配列の先頭要素を参照できる。これにアドレス演算子(&)をつけて、
&array[0]
とすると、先頭要素のアドレスが得られる。配列の要素すべてのアドレスを下記のプログラムを実行して確認してみよう。
#include <stdio.h>
int main(void)
{
int array[3] = {10,20,30};
printf("array[0]のアドレス:%p\n",&array[0]);
printf("array[1]のアドレス:%p\n",&array[1]);
printf("array[2]のアドレス:%p\n",&array[2]);
return 0;
}
実行結果
array[0]のアドレス:0x7ffdf92c4fec
array[1]のアドレス:0x7ffdf92c4ff0
array[2]のアドレス:0x7ffdf92c4ff4
アドレス値を確認すると、3つの要素のアドレス値は、4バイト間隔になっている。すなわち、int型のサイズが4バイトであることから、メモリ上では連続して確保されていることがわかる。
以上の点をまとめると下記の図のとおりとなる。
なお、[ ]がない配列名arrayは、先頭要素のアドレスを表す。
配列とポインタ
int *p = array;
とすると、ポインタ変数pには、配列の先頭要素のアドレスが代入される。すると、「*p」は、配列の先頭要素array[0]の別名として使える。
つまり、
array[0] = 10;
と、
*p = 10;
は同じとなる。
さらに、ポインタ変数pに[ ]をつけることもできる。p[0]はarray[0]と同じ値を参照する。同様に、p[1]はarray[1]の値を、p[2]はarray[2]の値を参照する。
つまり、array[0]と*pとp[0]はいずれも同じ値を参照している。これを、下記のプログラムを実行して、さらにその下の図で確認してみよう。
#include <stdio.h>
int main(void)
{
int array[] = { 10,20,30 };
int *p = array;
printf("*pの値は%d¥n",*p);
printf("p[0]の値は%d\n",p[0]);
printf("p[1]の値は%d\n",p[1]);
printf("p[2]の値は%d\n",p[2]);
return 0;
}
実行結果
*pの値は10
p[0]の値は10
p[1]の値は20
p[2]の値は30
コメント