配列の要素は原則として、順番にメモリ上に並んでいます。それでは実際に各要素のアドレスをしらべるプログラムを作ってみましょう。
1|/* array03.c */ 2| 3|#include <stdio.h> 4| 5|int main(void) 6|{ 7| int a[4] = {1, 2, 3, 4}, i; 8| 9| for (i = 0; i < 4; i++){ 10| printf("&a[%d] = %p\n", i, &a[i]); 11| } 12| printf("\na = %p\n", a); 13| return 0; 14|}
&a[0] = 0x7fff5fbff620 &a[1] = 0x7fff5fbff624 &a[2] = 0x7fff5fbff628 &a[3] = 0x7fff5fbff62c a = 0x7fff5fbff620
a のアドレスは a[0] と同じですね。しかも a は配列の名前です。実は配列の名前は、その配列の先頭要素のアドレスを表しているのです。
1|/* array04.c */ 2| 3|#include <stdio.h> 4| 5|int main(void) 6|{ 7| int a[] = {10, 20, 30, 40}, i, *p; 8| 9| p = a; 10| 11| for (i = 0; i < 4; i++){ 12| printf("&a[%d] = %p, a[%d] = %d, *(p + %d) =%d\n", 13| i, &a[i], i, a[i], i, *(p + i)); 14| } 15| return 0; 16|}
&a[0] = 0x7fff5fbff630, a[0] = 10, *(p + 0) =10 &a[1] = 0x7fff5fbff634, a[1] = 20, *(p + 1) =20 &a[2] = 0x7fff5fbff638, a[2] = 30, *(p + 2) =30 &a[3] = 0x7fff5fbff63c, a[3] = 40, *(p + 3) =40
1|/* array05.c */ 2| 3|#include <stdio.h> 4| 5|int main(void) 6|{ 7| int *p, i, a[] = {20, 40 ,80, 100}; 8| 9| p = a; 10| 11| for(i = 0; i < 4; i++){ 12| printf("&a[%d] = %p, (p + %d) = %p, (a + %d) = %p\n", 13| i, &a[i], i, p + i, i, a + i); 14| } 15| return 0; 16|}
&a[0] = 0x7fff5fbff630, (p + 0) = 0x7fff5fbff630, (a + 0) = 0x7fff5fbff630 &a[1] = 0x7fff5fbff634, (p + 1) = 0x7fff5fbff634, (a + 1) = 0x7fff5fbff634 &a[2] = 0x7fff5fbff638, (p + 2) = 0x7fff5fbff638, (a + 2) = 0x7fff5fbff638 &a[3] = 0x7fff5fbff63c, (p + 3) = 0x7fff5fbff63c, (a + 3) = 0x7fff5fbff63c