[C言語] Cパズルブック 6.1.5-7 単純なポインタと配列 デクリメント

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

問6.1.5-7のコードと出力は以下の通りです。

いずれも配列の最後の要素から左に向かって読み込んでいくという内容です。

&a[4] と a + 4が同義であるというのが、私にとって新たな知見でした。まあ基本的に添字を使用しますが、AVRマイコンなどメモリ容量が極端に少ない環境では、添字 iの分だけメモリ消費を減らせるので役立ちそうです。

#include "defs.h"

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

int main() {
    int i, *p;

    // 問6.1.5 配列のポインタを最後の要素4に置き、左に読んでいく
    for (p = a + 4; p >= a; p--){
        printf("*p = %d a[0] = %d\n", *p, a[0]);
        PR(d, *p);
        NL;
    }
    NL;

    // 問6.1.6 配列のポインタを最後の要素4に置き、左に読んでいく(添字を使用)
    for (p = a + 4, i = 0; i <= 4; i++){
        printf("*p = %d i = %d\n", *p, i);
        PR(d, p[-i]);
        NL;
    }
    NL;

    // 問6.1.7 配列のポインタを最後の要素4に置き、左に読んでいく(配列aを使用)
    for (p = a + 4; p >= a; p--){
        printf("*p = %d a[0] = %d\n", *p, a[0]);
        PR(d, a[p - a]);
        NL;
    }

    return 0;
}
*p = 4 a[0] = 0
value = 4	
*p = 3 a[0] = 0
value = 3	
*p = 2 a[0] = 0
value = 2	
*p = 1 a[0] = 0
value = 1	
*p = 0 a[0] = 0
value = 0	

*p = 4 i = 0
value = 4	
*p = 4 i = 1
value = 3	
*p = 4 i = 2
value = 2	
*p = 4 i = 3
value = 1	
*p = 4 i = 4
value = 0	

*p = 4 a[0] = 0
value = 4	
*p = 3 a[0] = 0
value = 3	
*p = 2 a[0] = 0
value = 2	
*p = 1 a[0] = 0
value = 1	
*p = 0 a[0] = 0
value = 0