[C言語] Cパズルブック 6.2.1-2 ポインタの配列 ポインタのポインタ

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

問6.2.1-2のコードと出力は以下の通りです。フォーマット指定子は10進数dから16進数xに変更しています。

ポインタのポインタを使うことでデータのアドレスを動的に変更でき、変数を効率的に共有できるようになります。

#include "defs.h"

int a[] = {0, 1, 2, 3, 4};
int *p[] = {a, a+1, a+2, a+3, a+4};
int **pp = p;

int main() {
    PRINT2(x, a, *a);
    PRINT3(x, p, *p, **p);
    PRINT3(x, pp, *pp, **pp);

    printf("&pp: %x\n", &pp); //「ポインタのポインタ」アドレス

    return 0;
}
value = 4c04000	value = 0	
value = 4c04018	value = 4c04000	value = 0	
value = 4c04018	value = 4c04000	value = 0	
&pp: 4c04040

配列aのアドレス: 4c04000、格納データ: {0,1,2,3,4}
「ポインタ」アドレス: 4c04018、格納データ: 4c04000
「ポインタのポインタ」アドレス: 4c04040、格納データ: 4c04018

「ポインタ」アドレスの格納データ4c04000を動的に変更して変数を効率的に共有する。