<問題> プログラムを読み、実行例を確認しなさい。(よくわかるC,p.83を改編)
<実行例>
size of int = 4 byte, size of float = 4 byte, size of char = 1 byte (← 各型のサイズ)
ADDRESS: &a[0] = 18ff40, a = 18ff40 p = 18ff40 (各表記が、どれも同じ意味になっていることに注意。配列aが確保されている先頭アドレス)
ADDRESS: &a[0] = 18ff40, a[0] = 1
ADDRESS: p+0 = 18ff40 *(p+0) = 1
ADDRESS: &a[1] = 18ff44, a[1] = 3
ADDRESS: p+1 = 18ff44 *(p+1) = 3
ADDRESS: &a[2] = 18ff48, a[2] = 5
ADDRESS: p+2 = 18ff48 *(p+2) = 5
ADDRESS: &a[3] = 18ff4c, a[3] = 7
ADDRESS: p+3 = 18ff4c *(p+3) = 7
ADDRESS: &a[4] = 18ff50, a[4] = 9
ADDRESS: p+4 = 18ff50 *(p+4) = 9
解答例 #include <stdio.h> int main(void) { int a[5] = {1,3,5,7,9}; int i, *p; p = a; /* 各型のサイズ */ printf("size of int = %d byte, size of float = %d byte, size of char = %d byte \n", sizeof(int), sizeof(float), sizeof(char)); /* アドレス確認。16進数で表記 %x */ /* 配列a について、&a[0]と、aは同じ意味。先頭アドレス */ printf("ADDRESS: &a[0] = %x, a = %x p = %x\n\n", &a[0], a, p); for (i = 0; i < 5 ; i++) { /* ポインターは配列と同じようにも扱える。次の要素のアドレス。p= p + 1は、p++ と表現できる*/ printf("ADDRESS: &a[%d] = %x, a[%d] = %d \n",i, &a[i], i, a[i]); printf("ADDRESS: p+%d = %x *(p+%d) = %d \n\n", i, (p+i), i, *(p+i)); } return 0; }