48

検討:

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

誰かがそれを説明できますか?

4

4 に答える 4

97

キーは+=and++演算子の優先順位です。は++よりも優先順位が高い+=(実際、C では代入演算子の優先順位が 2 番目に低い)。

*p++

ポインターを逆参照し、ポインター自体を 1 ずつインクリメントすることを意味します (通常、ポインター演算の規則によれば、必ずしも 1 バイトではなくsizeof(*p)、結果のアドレスに関するものです)。一方で、

*p += 1

ポインターが指す値を 1 だけインクリメントすることを意味します(ポインター自体は何もしません)。

于 2012-08-31T19:25:34.317 に答える
28

優先順位。接尾++辞は接頭辞よりも強くバインド*されるため、増加しますp。は+=、単純な代入演算子とともに、優先順位リストの最下位にあるため、 に 1 を追加し*pます。

于 2012-08-31T19:25:56.637 に答える