ase*_*dik 5 c pointers pass-by-reference post-increment
我有一个从这次讨论中提出的问题:C - 修改传递给函数的指针的地址
假设我有以下代码:
#include <stdio.h>
foo(char **ptr){
*ptr++;
}
int main()
{
char *ptr = malloc(64);
char arr[] = "Hello World!";
memcpy(ptr, arr, sizeof(arr));
foo(&ptr);
foo(&ptr);
printf("%s",ptr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想知道这个程序的输出是什么,我认为它应该是llo World!。
经过一番调查后,我发现了上面链接的问题,并意识到,在 C 中,函数的参数总是按值传递。到目前为止没有问题。当将*ptr++;表达式更改为 ->*ptr = *ptr +1;输出时,将变为:llo World!。
在这一点上,我可以说我有点困惑。为了改变指针地址,我们需要一个双指针。这很好,但是为什么后期增量操作会有所不同呢?是因为运算符优先级吗?
这里我在在线 C 编译器中尝试了这个例子。
后缀增量运算符的++优先级高于解引用运算符*。所以这:
*ptr++;
Run Code Online (Sandbox Code Playgroud)
解析为:
*(ptr++);
Run Code Online (Sandbox Code Playgroud)
所以它改变了参数值本身,而不是它指向的内容。相反,你想要:
(*ptr)++;
Run Code Online (Sandbox Code Playgroud)