【发布时间】:2019-03-08 02:22:55
【问题描述】:
在尝试编译void some_function(int * & some_pointer);并收到编译器错误:expected ';', ',' or ')' before '&' token.后,我意识到只有删除函数的引用才能编译
void some_function(int * some_pointer);
研究我找到了解决方案:“不能在 C 中通过引用传递”。它不会编译那个函数。
然而,它引起了人们的注意:scanf("%d", &my_var);我们一直通过引用传递......
它是如何工作的?
我假设我们不能创建请求引用的函数,因为我们可以使用引用作为参数。程序将按值传递它,然后更改原始变量。这是正确的吗?
或者是函数要求一个指针,当我们使用&它创建一个指向该变量的指针?我很困惑。
【问题讨论】:
-
传递变量的地址(按值)不是按引用传递。
-
@Shawn:传递对象的地址就是通过引用传递。 “通过引用传递”的意思就是,传递某种引用对象的方式,而不是直接传递对象的值。 C++ 和其他语言将此作为语言直接提供的功能,因此您可以将左值放在参数位置,编译器会通过引用自动传递它(编译器主要通过传递地址来实现)。但是,自己动手传递地址的方式仍然是通过引用传递。
-
@Eric 这完全取决于您与之通信的抽象级别。 C++“引用”是实现更广泛的“按引用传递”计算概念的方法的子集,如果您在该领域讨论,那么当您传递一个指针完全错误。但在其他时候它是完全正确的。最好避免在这个话题上做出笼统的陈述,因为你永远是错的,同时你也永远是对的,同时你也会让别人感到困惑;)
-
@Eric 否。如果它是通过引用传递的,您可以为传递的指针分配一个新地址,并将该更改反映在调用者中,就像您在 C++ 中为引用分配一个新值一样。 C只有传值;所有函数参数都被复制,调用者看不到对它们的更改。修改所指向的值不应与通过引用相混淆,尽管它可以通过额外的间接层来模拟这个概念。
-
@Shawn:指向的对象是通过引用传递的。可以通过为其分配一个新值来更改它(通过将
*应用于指针形成的左值)。指针按值传递。我可以告诉你,在 C++ 存在之前,我们指的是在通过地址传递事物时通过引用传递事物。 C++ 只是提供了一种速记的内置方式来执行此操作;它并没有改变这样一个事实,即它也可以通过手动方式完成,并且将引用(在常见的英语含义中)传递给某物是通过引用传递。