尝试编译void some_function(int * & some_pointer);
并收到编译器错误:expected ';', ',' or ')' before '&' token.
之后,我意识到只有在该函数的引用被删除后才能进行编译
void some_function(int * some_pointer);
经过研究,我找到了解决方案:“一个引用不能通过C传递”。它不会编译该函数。
但是,它引起了人们的注意:scanf("%d", &my_var);
我们一直都在引用作为参考...
如何运作?
我假设我们不能创建要求引用的函数,因为我们可以将引用用作参数。程序将按值传递它,然后将更改原始变量。这是对的吗?
该函数是在请求指针吗?当我们使用&
时,它会创建指向该变量的指针吗?我很困惑。
答案 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*&
)这类类型的一部分时,表示“引用”; 我认为选择使用&
作为引用类型,是为了节省创建新符号的时间,并尝试在指针和引用之间创建某种对称性。我认为这行不通;我认为这确实令人困惑。
但是对于您来说,在C语言中没有意义,因为(您已经发现!)C语言没有引用。相反,您的函数可以编写为采用指针到指针(int**
)。具有讽刺意味的是,您可能需要在调用站点上使用&
才能将您的参数提供给该函数!
更复杂的是,您有时会听到广义上使用的“通过参考”一词。这在C ++领域中令人困惑,因为“引用”在这里具有更具体的含义。实际上,引用是用C ++语言引入的,专门用于使“引用传递”更加优雅和直观。但是回到C语言,更笼统地说,这只是一种说法:“我们指的是事物而不是复制它”。实际上,在C语言中,我们这样做的方法实际上是传递一个 pointer 。
答案 2 :(得分:1)
严格来说,您不能在C中通过引用进行传递。相反,像在scanf()
示例中一样,可以按值将变量(也称为指针)的地址传递给函数,并且您可以< em>假装您已通过引用传递了变量,但是对C代码的字面意义的解释与此不同。
另一方面,您可以使用C ++引用真正通过引用传递变量。与前述的机制不同,该机制不求助于存储器位置的reification,即,在这种情况下,C ++(该语言)对变量的地址一无所知(尽管C ++编译器知道)。
所以,在C中,
另一方面,在C ++中使用引用时,