为什么在C语言中不能通过引用传递指针?

5

我正在学习C语言。在编写创建链表的代码时,遇到了一个分段错误。我在这个问题中找到了解决方案。我试图通过引用传递指针,但是解决方案说我们不能这样做。我们必须传递指向指针的指针。这个解决方案对我有效。但是,我不明白为什么会这样。有人能告诉我原因吗?


12
因为C语言中没有引用(references)。你需要理由来解释为什么C语言中没有引用吗? - user395760
2
语言不支持通过引用传递对象。就是这么简单。 - R Sahu
6
在C语言中,“一切”都是按值传递的(我几乎能闻到这个声明带来的争论)。如果你想要一个可以在调用方修改的参数,“值”你必须传递要修改的那个东西的地址,而且形式参数必须声明为指向该类型的指针(即使它是一个指针,在这种情况下它将是一个指向指针的指针)。即使数组作为表达式的“值”是其第一个元素的地址,但它仍然是一个“值”(它提供了访问调用者变量的方法)。 - WhozCraig
2
也许这篇文章也可以帮助你理解:http://stackoverflow.com/questions/23963269/can-someone-explain-how-pointer-to-pointer-works/23964156#23964156 基本上,为了操作指针指向的位置,必须要知道它的地址。一个对象的地址就是该对象的指针。因此,传递一个指向指针的指针(即指针的指针)将允许被调用的函数更改指针所指向的位置。 - Mahonri Moriancumer
1
在C++中,“引用”也是一个指针,只是对外不可见。因此,如果您在C中传递一个指针(或者在您的情况下是指向指针的指针),那么它与在C++中传递引用的代码相同,只是语法不同。 - Devolus
显示剩余4条评论
1个回答

9

来自《C程序设计语言第二版》(K&R 2):

5.2 指针和函数参数

由于C语言通过值传递参数给函数,所以被调用的函数无法直接修改调用函数中的变量。

...

指针参数使得一个函数能够访问和改变调用它的函数中的对象。

如果您理解了上述内容:

void fn1(int x) {
    x = 5; /* a in main is not affected */
}
void fn2(int *x) {
    *x = 5; /* a in main is affected */
}
int main(void) {
    int a;

    fn1(a);
    fn2(&a);
    return 0;
}

出于同样的原因:

void fn1(element *x) {
    x = malloc(sizeof(element)); /* a in main is not affected */
}
void fn2(element **x) {
    *x = malloc(sizeof(element)); /* a in main is affected */
}
int main(void) {
    element *a;

    fn1(a);
    fn2(&a);
    return 0;
}

正如您所看到的,int和元素指针之间没有区别,在第一个示例中,您需要传递指向int的指针,在第二个示例中,您需要传递指向元素指针的指针。

您似乎在引用某些来源(回答开始),能否提及此来源? - alk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接