配列とポインタ

<問題> プログラムを読み、実行例を確認しなさい。(よくわかる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;
}