我只是没有得到C++指针/参考系统

gnm*_*gnm 9 c++

我从未遇到像Python(隐式)或PHP(显式&)那样的引用问题.在PHP中,您可以编写$p = &$myvar;$p作为参考指向$myVar.

所以我知道在C++中你可以这样做:

void setToSomething( int& var )
{
 var = 123;
}
int myInt;
setToSomething( myInt );
Run Code Online (Sandbox Code Playgroud)
  • myInt现在是123,为什么?

不是指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,香草intint引用.(后者立即初始化,因为你不能有一个未初始化的参考.)请注意,类型修饰符语法属于声明的变量,其类型,他们正在修改,不声明变量的类型.然而,类型修饰符(*&)修改变量的类型.
但是,在以下情况中,使用pi假定已经声明的变量

*pp = &i;
Run Code Online (Sandbox Code Playgroud)

*并且&是一元前缀运算符解除引用pp并产生地址i.

(同样,类型修饰符[]应用于声明的变量时,会将变量的类型修改为数组,而二进制中缀运算符[],当应用于数组类型的对象时,将访问其子对象之一. )


为了事情变得更加复杂,除了类型修饰符一元前缀运算符 &*,也存在二元中缀运算符 &*,意思是"按位"和"乘法".并且为了增加对损伤的侮辱,在C++中,您可以为这些运算符(和二进制中缀)的一元前缀二进制中缀变量重载用户定义的类型,并且对于它们的语义完全免费. []

  • 很好,你如何指出C++语法的特性:-D (2认同)

Bas*_*ard 12

在第一个示例中,&用于声明引用类型.它与&用于获取对象地址的运算符不同.

您可以将引用类型视为一种类型,它在封面下使用一个永远不会的指针NULL.

  • @gnm:指针优于引用的优点是稍后可以将它们重置为指向其他对象.这使他们更灵活.引用优于指针的优点是它们不能重置为指向除初始化之外的任何其他对象.因为这包括他们不能(好,它们更难以拥有它们)指向不再存在的对象,这使它们更安全. (9认同)
  • @gnm:你可以做一些事情,邪恶的事情,指针你不能用引用.有时那些是必要的. (4认同)
  • @Vivek:我没有看到使用指针如何为您提供速度优势而不是引用. (3认同)
  • @sbi完全正确指针的一个优点.这是另一个:你可以有几个级别的间接,即指针指针.对于引用来说这是不可能的(你不能获取引用的地址,只能引用引用指向的内容).当然,几个层次的间接倾向于打结大脑,所以应该谨慎使用它们,但是,有些情况下它们真的很方便.例如,搜索和删除链接列表中的条目. (2认同)