为什么*p ++与*p + = 1不同?

Jac*_*ack 46 c

考虑:

void foo1(char **p) { *p++; }
void foo2(char **p) { *p += 1; }
Run Code Online (Sandbox Code Playgroud)

char *s = "abcd";
char *a = s; 
foo1(&a); 
printf("%s", a); //abcd
Run Code Online (Sandbox Code Playgroud)

但如果我使用foo2()而不是:

char *a = s; 
foo2(&a); 
printf("%s", a); //bcd
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?

小智 95

关键是+=++操作员的优先顺序.在++具有比一更高的优先级+=(事实上,赋值运算符在C所述第二优先级最低),所以操作

*p++
Run Code Online (Sandbox Code Playgroud)

表示取消引用指针,然后将指针本身递增1(通常,根据指针算法的规则,它不一定是一个字节,而是sizeof(*p)关于结果地址).另一方面,

*p += 1
Run Code Online (Sandbox Code Playgroud)

表示将指针指向的值增加1(并且不对指针本身执行任何操作).

  • 你做了如此出色的解释,但是你可以加入一个细节*p ++将指针本身增加1"单位",这样一个char指针可能会增加1,而一个int指针可能会增加4,等等,取决于具体实施细节. (8认同)
  • @EdwinBuck指针是指int还是char,当你递增它时,它会增加1.由于指针的大小,表示该指针的实际地址可能会改变多个字节. (5认同)
  • @EdwinBuck:我没有真正看到相关性,这只是正常的指针算术而不是问题的焦点. (4认同)

Ala*_*rry 29

优先级.后缀++绑定比前缀更紧密,*因此它会递增p.该+=是在优先列表的低端,与普通赋值运算符一起,所以加1 *p.