C 指针作为函数参数指向指针

C 指针作为函数参数指向指针,c,pointers,C,Pointers,我有以下代码: #包括 #包括 整数f(整数x,整数*py,整数**ppz){ int y,z; **ppz+=1; z=**ppz; *py+=2; y=*py; x+=3; 返回x+y+z; } 内部主(空){ int c=4; printf(“f():%d\n”,f(c,&c,&c)); printf(“c:%d\n”,c); 返回退出成功; } 我如何才能正确访问**ppz,因为我会收到一条错误消息:“使用了标签'c',但未定义”。一个int**是指向int*的指针。您需要创建一个in

我有以下代码:

#包括
#包括
整数f(整数x,整数*py,整数**ppz){
int y,z;
**ppz+=1;
z=**ppz;
*py+=2;
y=*py;
x+=3;
返回x+y+z;
}
内部主(空){
int c=4;
printf(“f():%d\n”,f(c,&c,&c));
printf(“c:%d\n”,c);
返回退出成功;
}

我如何才能正确访问
**ppz
,因为我会收到一条错误消息:“使用了标签'c',但未定义”。

一个
int**
是指向
int*
的指针。您需要创建一个
int*
类型的变量,以便能够将指针传递到它的某个位置。以下是您应该做的:

int main(void) {
    int c = 4;
    int* pc = &c;

    printf("f(): %d\n", f(c, pc, &pc));
    printf("c:   %d\n", c);
    return EXIT_SUCCESS;
}

请参阅@ikegami的答案,了解指针指针正确使用的说明。

您希望修改
int
类型的变量,因此参数应为
int*
,而不是
int**

如果要修改
int*
variable类型的变量,可以使用
int**
。这里不是这样

比如说,

void f(int **pp) {
    *pp = malloc(10);
}

int main(void) {
    int *p;
    f(&p);
    // ...
    free(p);
}

您想修改
int
,因此参数应该是
int*
,而不是
int**
&c
是指针表达式。无法创建指向表达式的指针,因为它没有地址。。此外,
&&
运算符具有不同的含义。仅供参考,关于“使用了标签“c”的错误消息是因为
&&name
是引用语句标签的GCC扩展(通常是
goto
语句的目标)。对于需要
int**
的函数,该代码可能永远都不正确。它在这种特殊情况下有效,但只是因为在那里使用
int**
没有意义。你是什么意思?哦,我明白你的意思了。是的,你是对的,重点不是修改原始int,而是修改int*的值。但是,我认为OP的问题更多的是一个教学示例,旨在展示指针的功能/操作,而不是在适当的意义上正确使用双指针。“你是什么意思?”,如果
f
更改
*ppz
(这是
int**ppz
)的唯一原因,为什么你认为你的代码可以接受“我认为OP的问题更像是一个教学示例”,我认为你是对的,你没有教清楚如何正确使用
int**