考虑:
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(并且不对指针本身执行任何操作).