我从未遇到像Python(隐式)或PHP(显式&)那样的引用问题.在PHP中,您可以编写$p = &$myvar;并$p作为参考指向$myVar.
所以我知道在C++中你可以这样做:
void setToSomething( int& var )
{
var = 123;
}
int myInt;
setToSomething( myInt );
Run Code Online (Sandbox Code Playgroud)
不是指C++中"x的内存地址"?如果var只是地址myInt而不是指针,我该怎么办?
void setToSomething( int* var )
{
*var = 123;
}
int myInt;
int* myIntPtr = &myInt;
setToSomething( myIntPtr );
Run Code Online (Sandbox Code Playgroud)
我完全不理解*和&之间在C++中的区别.他们告诉你并且习惯于获取变量的地址,但是为什么它会帮助你处理函数等.就像在第一个例子中一样?
sbi*_*sbi 29
不是指C++中"x的内存地址"?
简短回答:这取决于.
更长的答案:一元前缀运算符&,当应用于对象时,确实产生对象的地址:&obj.但是,还有类型修饰符&,当应用于类型时,它会将其修改为引用类型:int&.
这同样适用于*:当用作一元前缀运算符时,它将取消引用指针:*ptr.当用作类型修饰符时,它会将类型修改为指针:int*.
这不是有益的,要么类型修饰符适用于所声明的变量.例如,这个
int *p, **pp, i, &r = i;
Run Code Online (Sandbox Code Playgroud)
定义int指针,指向指针的指针int,香草int和int引用.(后者立即初始化,因为你不能有一个未初始化的参考.)请注意,类型修饰符语法属于声明的变量,其类型,他们正在修改,不声明变量的类型.然而,类型修饰符(*和&)修改变量的类型.
但是,在以下情况中,使用p并i假定已经声明的变量
*pp = &i;
Run Code Online (Sandbox Code Playgroud)
*并且&是一元前缀运算符解除引用pp并产生地址i.
(同样,类型修饰符[]应用于声明的变量时,会将变量的类型修改为数组,而二进制中缀运算符[],当应用于数组类型的对象时,将访问其子对象之一. )
为了事情变得更加复杂,除了类型修饰符和一元前缀运算符 &和*,也存在二元中缀运算符 &和*,意思是"按位"和"乘法".并且为了增加对损伤的侮辱,在C++中,您可以为这些运算符(和二进制中缀)的一元前缀和二进制中缀变量重载用户定义的类型,并且对于它们的语义完全免费. []
Bas*_*ard 12
在第一个示例中,&用于声明引用类型.它与&用于获取对象地址的运算符不同.
您可以将引用类型视为一种类型,它在封面下使用一个永远不会的指针NULL.