ポインタは、整数の加算と減算だけができる。
int *p; ... p = p + 1;
ポインタの加算・減算は整数のそれと意味が異なる。ポインタはデータのアドレスを格納しているので、ポインタに 1 加算すると、次のデータを指すようになる。減算の場合は逆だ。
#include int main(void) { int ary[] = {1, 2, 3, 4, 5}; int *p; p = ary; printf("%d\n", *p); p = p + 1; printf("%d\n", *p); return 0; }
takatoh@nightschool $ ./sample_6_2a 1 2
上の例では、9行目で p に配列 ary のアドレスを代入している。この時点で p は ary の先頭の要素を指しているので、11行目の出力では、1 が出力されている。
その後、p に 1 加算すると、今度は ary の2番目の要素を指すようになる。なので、14行目の出力では 2 が出力されている。
ポインタの演算には、インクリメント演算子・デクリメント演算子も使える。
p++; p--;
整数のバイト同じく 1 加算したり減算したりするんだけど、上に書いたように制すのものとは意味が違う。
インクリメント演算子・デクリメント演算子を間接参照と一緒に使うときには注意が必要だ。次のように書くと、ポインタ自体がインクリメントされたあと間接参照が行われる。
*p++;
参照しているデータをインクリメントしたいときにはカッコをつける。
(*p)++;
次のプログラムでは、最初の出力ではポインタ自体がインクリメントされて配列の2番めの要素を指すようなった結果 20 と出力され、2番めの出力ではポインタの指している配列の要素がインクリメントされて 21 と出力される。
#include int main(void) { int narray[] = {1, 20, 300, 4000}; int *p = narray; *p++; printf("%d\n", *p); (*p)++; printf("%d\n", *p); return 0; }
takatoh@nightschool $ ./sample_6_2b 20 21