考慮する:
void foo1(char **p) { *p++; }
void foo2(char **p) { *p += 1; }
そして
char *s = "abcd";
char *a = s;
foo1(&a);
printf("%s", a); //abcd
foo2()
ただし、代わりに以下を使用する場合:
char *a = s;
foo2(&a);
printf("%s", a); //bcd
誰か説明してくれませんか?
ベストアンサー1
鍵となるのは、演算子+=
と++
演算子の優先順位です。演算子は演算子++
よりも優先順位が高いため+=
(実際、Cでは代入演算子の優先順位は2番目に低い)、
*p++
ポインタを逆参照し、ポインタをインクリメントすることを意味する自体1 ずつ増加します (通常、ポインタ演算の規則によれば、必ずしも 1 バイトではなく、sizeof(*p)
結果のアドレスに関するものです)。一方、
*p += 1
値を増やすことを意味しますポインタによって指される1 つ増やします (ポインター自体は何もしません)。