在尝试编译void some_function(int *& some_pointer);并在’&‘之前收到编译器错误:expected’;‘,’,‘或’)’令牌。我意识到我只能编译函数…
或者是要求指针的功能以及何时使用&它创建一个指向该变量的指针?
这是完全正确的。
在C ++中,符号 & 有多重含义:
&
int&
int*&
随着选择使用 & 对于参考类型,我认为这个想法是保存创建新符号并尝试在指针和引用之间创建一些对称性。我觉得它不起作用;我认为这真的令人困惑。
但对你而言,在C中,它没有实际意义,因为(正如你所发现的那样!)C没有引用。相反,你的函数可以编写为指针指针( int** )。具有讽刺意味的是,您可能需要使用 & 在呼叫现场向你展示这样一个函数的论点!
int**
作为进一步的复杂情况,您有时会听到广义上使用的“通过引用传递”这一短语。这在C ++领域令人困惑,因为“引用”在那里具有更具体的含义。实际上,引用是在C ++语言中引入的,专门用于使“通过引用传递”更加优雅和直观。但回到C语言,更一般地说,它只是一种说“我们指的是一件事而不是复制它”;从技术上来说,我们这样做的方式确实是通过了 指针 。
严格来说,你不能在C中通过引用传递。相反,就像在你的 scanf() 例如,您可以通过值将变量(a.k.a,指针)的地址传递给函数,您可以 假装 您已通过引用传递变量,但对C代码的文字解释与此不一致。
scanf()
另一方面,您可以使用C ++引用通过引用真正传递变量。与上述方法不同,这种机制不适合 物化 对于内存位置,即在这种情况下,C ++(该语言)对变量的地址一无所知(但C ++编译器会这样做)。
所以,在C中,
另一方面,在C ++中使用引用时,
虽然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) , & operator获取其操作数的地址并将该地址传递给 f 。它是 不 一个参考。
f(&x)
f