[C言語] Cパズルブック 6.1.2-4 単純なポインタと配列

『Cパズルブック』(Alan R.Feuer, 1985)
[Mac M2 Pro 12CPU, macOS Ventura 13.3.1, clang 14.0.3]

問6.1.2-4のコードおよび出力は以下の通りです。

6.1.4のp++は整数1をインクリメントするのではなく、メモリ番地が1番地増えるという意味になります。

6.1.4でメモリ番地が1増えているのにメモリアドレスは4増えているというところが引っかかったので、LLDBデバッガでメモリ格納状態を確認しました。

intのサイズが4バイトのため、メモリアドレスが4増えているということでした。次行のPRマクロでさらに4増えて、結局1つ飛ばしで配列を読み込むことになります。

パズルのために考えられたような問題ですから実務にはあまり役立ちそうにありません。これ以上深追いしないのが吉でしょう。

#include "defs.h"

int a[] = {0, 1, 2, 3, 4};

int main() {
    int i, *p;

    // 問6.1.2 メモリアドレスへアクセス
    for (p = &a[0]; p <= &a[4]; p++){
        PR(d, *p);
    }
    NL;

    // 問6.1.3 ポインタを配列先頭にする
    for (p = &a[0], i = 1; i <= 5; i++){
        PR(d, p[i]);
    }
    NL;
    NL;

    // 問6.1.4 偶数を出力
    for (p = a, i = 0; p+i <= a+4; p++, i++){
        printf("p = %x i = %d a = %x\n", p, i, a);
        PR(d, *(p+i));
        NL;
    }
    NL;

    // 問6.1.4a 全てを出力
    printf("6.1.4a\n");
    for (p = a, i = 0; p+i <= a+4; i++){
        printf("p = %x i = %d a = %x\n", p, i, a);
        PR(d, *(p+i));
        NL;
    }

    printf("Size of p: %zu bytes\n", sizeof(p));
    printf("Size of int: %zu bytes\n", sizeof(int));

    return 0;
}
value = 0	value = 1	value = 2	value = 3	value = 4	
value = 1	value = 2	value = 3	value = 4	value = 0	

p = 482c000 i = 0 a = 482c000
value = 0	
p = 482c004 i = 1 a = 482c000
value = 2	
p = 482c008 i = 2 a = 482c000
value = 4	

6.1.4a
p = 482c000 i = 0 a = 482c000
value = 0	
p = 482c000 i = 1 a = 482c000
value = 1	
p = 482c000 i = 2 a = 482c000
value = 2	
p = 482c000 i = 3 a = 482c000
value = 3	
p = 482c000 i = 4 a = 482c000
value = 4	
Size of p: 8 bytes
Size of int: 4 bytes