配列とアドレス
配列の要素は原則として、順番にメモリ上に並んでいる。
配列の各要素のアドレスを調べてみよう
#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)と同じということが分かる。