我要求澄清C中的“不通过引用”

时间:2019-03-08 02:22:55

标签: c pointers reference

尝试编译void some_function(int * & some_pointer);并收到编译器错误:expected ';', ',' or ')' before '&' token.之后,我意识到只有在该函数的引用被删除后才能进行编译  void some_function(int * some_pointer);

经过研究,我找到了解决方案:“一个引用不能通过C传递”。它不会编译该函数。

但是,它引起了人们的注意:scanf("%d", &my_var);我们一直都在引用作为参考... 如何运作? 我假设我们不能创建要求引用的函数,因为我们可以将引用用作参数。程序将按值传递它,然后将更改原始变量。这是对的吗?

该函数是在请求指针吗?当我们使用&时,它会创建指向该变量的指针吗?我很困惑。

3 个答案:

答案 0 :(得分:2)

虽然C中的函数不支持您发现的按引用传递,但是它们可以通过接受指针值来模拟按引用传递,然后在调用该函数时,可以将变量的地址传递给它。这样,调用函数可以取消引用指针并在调用函数中更改变量。

例如:

void f(int *x)
{
    *x = 4;
}

int main()
{
    int x = 0;
    printf("x=%d\n", x);    // prints 0
    f(&x);
    printf("x=%d\n", x);    // prints 4
}

当我们调用类似f(&x)的函数时,&运算符获取其操作数的地址,并将该地址传递给f。它不是参考。

答案 1 :(得分:1)

  

该函数是在请求指针吗?当我们使用&时,它会创建指向该变量的指针吗?

完全正确。

在C ++中,符号&具有多种含义:

  • 在表达式中用作一元运算符时,它的意思是“获取地址”,并产生一个指针;
  • 当属于int&(或者实际上是int*&)这类类型的一部分时,表示“引用”;
  • (而且,当用作两个算术表达式之间的二进制运算符时,表示“按位 AND ”。)

我认为选择使用&作为引用类型,是为了节省创建新符号的时间,并尝试在指针和引用之间创建某种对称性。我认为这行不通;我认为这确实令人困惑。

但是对于您来说,在C语言中没有意义,因为(您已经发现!)C语言没有引用。相反,您的函数可以编写为采用指针到指针(int**)。具有讽刺意味的是,您可能需要在调用站点上使用&才能将您的参数提供给该函数!

更复杂的是,您有时会听到广义上使用的“通过参考”一词。这在C ++领域中令人困惑,因为“引用”在这里具有更具体的含义。实际上,引用是用C ++语言引入的,专门用于使“引用传递”更加优雅和直观。但是回到C语言,更笼统地说,这只是一种说法:“我们指的是事物而不是复制它”。实际上,在C语言中,我们这样做的方法实际上是传递一个 pointer

答案 2 :(得分:1)

严格来说,您不能在C中通过引用进行传递。相反,像在scanf()示例中一样,可以按值将变量(也称为指针)的地址传递给函数,并且您可以< em>假装您已通过引用传递了变量,但是对C代码的字面意义的解释与此不同。

另一方面,您可以使用C ++引用真正通过引用传递变量。与前述的机制不同,该机制不求助于存储器位置的reification,即,在这种情况下,C ++(该语言)对变量的地址一无所知(尽管C ++编译器知道)。

所以,在C中,

  • 可以通过引用(“解释性”意义上)通过。
  • 您的C代码本身不能通过引用传递任何内容。

另一方面,在C ++中使用引用时,

  • 可以通过引用传递。
  • 您的C ++代码也可以通过引用传递。