配列とアドレス


配列の要素は原則として、順番にメモリ上に並んでいます。それでは実際に各要素のアドレスをしらべるプログラムを作ってみましょう。

ソースコード

源文件
  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


Chapte7 @ C言語目録 @ HomeWork List @ 昭亮's Homepage