我有一个方法:
odp(foo& bar);
我试着称之为:
foo baz;
odp(&baz);
我收到编译错误:
error C2664: "odp" cannot convert parameter 1 from 'foo *' to 'foo &'
我做错了什么?我不是在提及baz
吗?
UPDATE :也许我对指针和引用之间的关系有误解。我认为它们是相同的,除了引用不能为空。这是不正确的吗?
答案 0 :(得分:7)
将一元&
运算符应用于对象时,会得到该对象的指针,而不是引用。在这种情况下你需要一个参考。为了初始化引用参数,您根本不需要应用任何运算符:可以立即使用左值对象来初始化相应类型的引用。
“指针”和“引用”概念之间的非正式同义(如“通过指针传递”和“通过引用传递”)特定于C语言。但在C ++中,它们意味着两种完全不同的东西。
答案 1 :(得分:4)
odp函数需要引用foo var而你传递的是foo var(指针)的地址。
只需传递baz
,如:
foo baz;
opd(baz);
它会编译。
答案 2 :(得分:2)
不,您将指针传递给baz
。放下&
。
答案 3 :(得分:2)
当你使用& baz时,你实际上是在说baz的地址,所以你传递了一个指针。
答案 4 :(得分:1)
引用和指针在C ++中并不相同 - 尽管您可能已经读过大多数编译器在机器代码级别使用指针实现引用。你不需要关心编译器如何实现它们 - 但是“引用”和“指针”的语义在C ++中是什么。
int i = 5;
int &j = i; // j refers to the variable i
// wherever the code uses j, it actually uses i
j++; // I just changed i from 5 to 6
int *pj = &i; // pj is a pointer to i
(*pj)--; // I just changed i back to 5
请注意,我可以将pj更改为指向另一个整数,但我无法更改引用j以引用另一个整数。
int k = 10;
pj = &k; // pj now actually points to k
(*pj)++; // I just changed k to 11
j = k; // no, this doesn't change the reference j to refer to k instead of i,
// but this statement just assigned k to i, that is, i now equals 11!
答案 5 :(得分:1)
在C ++中,引用是别名,不是地址。例如,您可以为单个指针指定多个名称,就像您可能有一个真实对象的多个名称一样。
当您声明一个带参考参数的函数时,该函数将自动为您传递给它的变量添加别名。但是,无论它是什么别名,都必须与参考类型相同。在您的情况下,您使用int*
引用对int
进行别名,这是没有意义的。
答案 6 :(得分:0)
也许你被旧的C约定误导了?在C中,您通过创建指针“通过引用传递”,因为该语言没有引用 - 您使用指针“引用”原始变量。在C ++中,语言支持 ,并且在调用函数时无需创建指向变量的指针。
foo baz;
odp(baz);