C 递增指针地址传递给函数 ++ 运算符

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 编译器中尝试了这个例子。

dbu*_*ush 3

后缀增量运算符的++优先级高于解引用运算符*。所以这:

*ptr++;
Run Code Online (Sandbox Code Playgroud)

解析为:

*(ptr++);
Run Code Online (Sandbox Code Playgroud)

所以它改变了参数值本身,而不是它指向的内容。相反,你想要:

(*ptr)++;
Run Code Online (Sandbox Code Playgroud)