关于c ++:*和&的含义是什么?

What's the meaning of * and & when applied to variable names?

在C++中,区别是什么?

1
2
3
4
5
6
7
8
9
10
 void func(MyType&); // declaration

 //...
 MyType * ptr;

 func(*ptr); // compiler doesnt give error

 func(ptr); // compiler gives error i thought & represents memory address so
            // this statement should correct as ptr is only a pointer
            // or address of some real var.


一元前缀操作符&应用于对象时,生成对象的地址:&obj。类型修饰符&应用于将要声明的变量时,会将变量的类型修改为引用类型:int&

这同样适用于*:当作为一元前缀运算符应用于指针时,它将取消对指针的引用,从而生成引用的对象:*ptr。当用作即将声明的变量的类型修饰符时,*将把类型修改为指针:int*

以类似的方式,应用于声明的变量的类型修饰符[]将把变量的类型修改为数组,而应用于数组类型的对象的二进制中缀运算符[]将访问数组的一个子对象。

类型修饰符应用于声明的变量,而不是应用于声明的类型,这没有帮助。例如,这个

1
int *p, **pp, i, a[10], &r = i;

定义int指针、指向int指针、普通int指针、10 int数组和int引用。(后者会立即初始化,因为不能有未初始化的引用。)请注意,类型修饰符在语法上属于要修改其类型的声明变量,而不是属于声明变量的类型。然而,类型修饰符(*&修改变量的类型。然而,在以下情况下,假定pia为已声明的变量。

1
2
*pp = &i;
a[0] = i;

*&是一元前缀运算符,它们取消引用pp并生成i的地址,而[]生成数组a中的第一个int对象。

事实上,C和C++不关心类型修饰符周围的白皮书,这导致了不同的阵营在放置它们时并不真的使事情变得更容易。有些人将类型修饰符放在类型附近。他们认为它修改了类型,所以应该这样做:

1
int* ptr;

缺点是,当声明几个对象时,这会变得混乱。这个

1
int* a, b;

a定义为指向int的指针,而b定义为int的指针。这就是为什么有些人喜欢写作

1
2
int *ptr;
int *a, *b;

我建议不要在同一语句中声明多个对象。使代码更容易阅读的IMO。而且,它让你可以自由选择任何一种惯例。

更为复杂的是,除了类型修饰符和一元前缀操作符&*之外,还有二进制中缀操作符&*,意思是"按位和"和"乘法"。另外,在C++中,您可以将这些运算符的一元前缀和二进制缀缀变体(以及二进制缀缀[])定义为用户定义的类型,并且对它们的语义完全自由。


mytype代表一个/reference/,一个完全不同的指向指针的beast。如果你的函数原型是

FUNC(MyType);

您将使用函数内参数的副本。用

func(mytype&;);

您正在处理对象本身(即调用范围和被调用范围中的同一对象)。在这种情况下,它类似于使用指针,但使用与对象相同的"点"语法。

当然,这是一个肤浅而简单的解释。对我来说,完全掌握指点、参考和其他部落的深层次需要数年时间。