【问题标题】:why can't we pass the pointer by reference in C?为什么我们不能在 C 中通过引用传递指针?
【发布时间】:2014-07-25 23:27:27
【问题描述】:

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

【问题讨论】:

  • 因为 C 中没有引用。您需要说明 C 中没有引用的原因吗?
  • 该语言不支持通过引用传递对象。就这么简单。
  • 在 C 中,everything 都是按值传递的(我几乎可以闻到火焰喷射器因该语句而升温)。如果你想有一个调用方可修改的参数,你传递的“值”必须是要修改的东西的地址,并且形式参数必须声明为指向该类型的指针(即使它是指针,在这种情况下,它将是一个指向指针的指针)。即使数组也是按值传递的,它只是按照数组的标准发生“值”,因为表达式是其第一个元素的地址。但它仍然是一个(不可否认,它可以让您访问调用者变量)。
  • 也许这篇文章也能帮助你理解:stackoverflow.com/questions/23963269/… 基本上,为了操纵指针指向的位置,你必须有它的地址。对象的地址是指向对象的指针。因此,传递指针的地址(即:指向指针的指针)将允许被调用函数更改指针指向的位置。
  • 在 C++ 中,“引用”也是一个指针,只是对外部不可见。因此,如果您在 C 中传递一个指针(或者在您的情况下是指向指针的指针),它与在 C++ 中传递引用的代码相同,只是语法不同。

标签: c pointers pass-by-reference


【解决方案1】:

来自The C Programming Language - Second Edition (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 的指针,在第二个示例中您需要传递指向指针的指针到元素。

【讨论】:

  • 您似乎引用了一些来源(开始回答)。你介意提一下这个来源吗?
猜你喜欢
  • 1970-01-01
  • 2010-09-24
  • 2020-03-14
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
相关资源
最近更新 更多