如果我有这样的功能:
void doSomething(int& aVar)
{
// do something
}
我有这个:
int *aVar = new int;
*aVar = 10;
doSomething(*aVar);
我为什么要打* aVar?是不是aVar已经是一个地址?
答案 0 :(得分:8)
不,引用不是指针。保证引用不为空;你不能对指针说同样的话。将int传递给期望int&的函数时参考将自动进行。
P.S。不要把它想象成地址或花哨的指针。它是现有对象的引用或别名。
答案 1 :(得分:2)
doSomething(int&)
想要引用而不是指针。将该引用设置为参数的方法是传入Int。这就是为什么
doSomething(*aVar)
的工作原理。如果你想在函数中使用指针
doSomething(int*)
引用和指针不是一回事(虽然它们有很多共同之处)
答案 2 :(得分:1)
星号,除了乘法有两个含义:
a)当声明变量时:* x表示“X是指针” b)当使用变量时:* x(当x是指针类型时)表示“取x指向的任何东西” - 与& x相反,表示“取x的地址”
代码:
doSomething(*aVar)
只想取消引用指针“aVar”(取其指向的int类型的值)并将此类型的int作为参数传递给函数。
变量“aVar”存储某个整数值的地址,而不是值本身,因此每次要访问整数时都必须使用“*”运算符取消引用它,而不是内存地址本身。 / p>
C ++中的引用是非常反直觉的(“伪装指针”),所以如果doSomething
接受对int的引用,则必须将其称为就像传递实际的int值而不是指针一样。因此,您需要取消引用运算符。
答案 3 :(得分:0)
指针指向特定的内存地址,指针有自己的数据(即它指向的内存地址)。当您将aVar传递给函数而不解除引用(*运算符)指针时,您将传递指针的内存位置,而不是指针指向的内存位置。