配列とアドレス

配列の要素は原則として、順番にメモリ上に並んでいる。

配列の各要素のアドレスを調べてみよう

#include <stdio.h>

int main()
{
        int a[4] = {1,2,3,4},i;
        
        for(i=0;i<4;i++){
                printf("&a[%d] = %p\n",i,&a[i]);
                
        }
        printf("\na = %p\n",a);
        return 0;
} 

実行結果

&a[0] = 0xbf8c0de0
&a[1] = 0xbf8c0de4
&a[2] = 0xbf8c0de8
&a[3] = 0xbf8c0dec

a = 0xbf8c0de0

確かに4バイトずつつながっている。

&a[0] = 0xbf8c0de0
a = 0xbf8c0de0

配列の名前は、その配列の先頭要素のアドレスを表している。
もしそうなら、aというアドレスより4バイト進めたらa[1]のアドレスになるのではないか、

確かめてみる

#include <stdio.h>

int main()
{
        int a[] = {10,20,30,40,},i,*p;

        p = a;
        for(i=0;i<4;i++){
                printf("&a[%d] = %p, a[%d] = %d, *(p+%d) = %d\n",
                i,&a[i],i,a[i],i,*(p+i));
        }
        return 0;
}

実行結果

&a[0] = 0xbfd9e2a8, a[0] = 10, *(p+0) = 10
&a[1] = 0xbfd9e2ac, a[1] = 20, *(p+1) = 20
&a[2] = 0xbfd9e2b0, a[2] = 30, *(p+2) = 30
&a[3] = 0xbfd9e2b4, a[3] = 40, *(p+3) = 40

a[1]のアドレスは(p+4)ではなくて(p+1)なのかな、実行結果を見ると1加えると4バイト進んでいる。

確かめてみる

#include <stdio.h>

int main()
{
	int *p,i,a[] = {20,40,80,10};

	p = a;

	for(i=0;i<4;i++){
		printf("&a[%d] = %p, (p+%d) = %p, (a+%d) = %p\n",
			i,&a[i],i,p+i,i,a+i);
	}
	return 0;
}

実行結果

&a[0] = 001BFD18, (p+0) = 001BFD18, (a+0) = 001BFD18
&a[1] = 001BFD1C, (p+1) = 001BFD1C, (a+1) = 001BFD1C
&a[2] = 001BFD20, (p+2) = 001BFD20, (a+2) = 001BFD20
&a[3] = 001BFD24, (p+3) = 001BFD24, (a+3) = 001BFD24

このことからa[n]は*(a+n)と同じということが分かる。