C_ 2 つのポインタ変数の差と比較

コピペ。

ある配列内の要素を指している 2 つのポインタ値 p, q差 p - q をとると、
それは p が指す要素の添字q が指す要素の添字となる。

    &ary[4] - &ary[1] == 3

これは、
2 つのポインタが指すアドレス間にある要素の個数と思えばよい。
f:id:koshinRan:20181114184142p:plain

 

「ポインタ値に整数値を加えると、その整数値の分だけ添字が大きい
添字の要素を指すようになる」の、逆の考え。
すなわち、

    &ary[1] + 3 == &ary[4]

という等式の &ary[1] を移項したものだと思えばよい。
なお、引く方の添字が大きいときは負の値となる。

    &ary[1] - &ary[4] == -3

ポインタ値 p, q のうち、 p が指す要素の添字の方が大きいかどうかは
p - q > 0 」または「 p > q 」で判断

 

ex ) は、p++ を繰り返す条件として「p < ary + 5」を指定し、
p-- を繰り返す条件として「 ary <= p 」を指定している。

ex )

    int ary[5];
    int *p;
   
    ary[0] = 1;
    p = ary + 1; // p には &ary[1] が入る
    while (p < ary + 5) {
        *p = *(p - 1) + 1; // p が指す配列要素にその一つ前の配列要素の値+1を代入
        p++;  // p が指す配列要素の添字が 1 増える
    }
    while (p > ary) {
        p--;  // p が指す配列要素の添字が 1 減る
        printf("%d ", *p);  // 5 4 3 2 1
    }

 

 

配列 ary に値を代入している上記コードのメモ

 

    p = ary + 1;

ary は ary[0] のポインタ。ポインタ + 整数値は、
配列ポインタの添え字移動なので、 ary + 1 は、ary[1] のポインタとなる。
故に p は &ary[1] 。

 

    while ( p < ary + 5 ) {

&ary[5] より小さい場合に while 文実行。

 

    *p = *(p - 1) + 1

p = &ary[1] の場合、( p - 1 )&ary[0]
*(&ary[0]) なので、ary[0] = 1 により、1 。
1 + 1 で、*p は 2。つまり ary[1] は 2 となる。

 

    p++

ポインタのインクリメント( 整数の加算 ) より、p[1] つまり、&ary[2] となる。

 

 

 

こちらから。数日経ったら忘れそう。
http://www.cc.kyoto-su.ac.jp/~yamada/programming/pointer.html

以上。