C言語の基礎(配列とポインタ)

スポンサーリンク
C言語

配列の要素のアドレス

配列とポインタは密接な関係がある。下記の例では、配列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
配列とポインタの関係

コメント

タイトルとURLをコピーしました