検討:
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
誰かがそれを説明できますか?
検討:
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
誰かがそれを説明できますか?
キーは+=
and++
演算子の優先順位です。は++
よりも優先順位が高い+=
(実際、C では代入演算子の優先順位が 2 番目に低い)。
*p++
ポインターを逆参照し、ポインター自体を 1 ずつインクリメントすることを意味します (通常、ポインター演算の規則によれば、必ずしも 1 バイトではなくsizeof(*p)
、結果のアドレスに関するものです)。一方で、
*p += 1
ポインターが指す値を 1 だけインクリメントすることを意味します(ポインター自体は何もしません)。
優先順位。接尾++
辞は接頭辞よりも強くバインド*
されるため、増加しますp
。は+=
、単純な代入演算子とともに、優先順位リストの最下位にあるため、 に 1 を追加し*p
ます。