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. |
一元前缀操作符
这同样适用于
以类似的方式,应用于声明的变量的类型修饰符
类型修饰符应用于声明的变量,而不是应用于声明的类型,这没有帮助。例如,这个
1 | int *p, **pp, i, a[10], &r = i; |
定义
1 2 | *pp = &i; a[0] = i; |
事实上,C和C++不关心类型修饰符周围的白皮书,这导致了不同的阵营在放置它们时并不真的使事情变得更容易。有些人将类型修饰符放在类型附近。他们认为它修改了类型,所以应该这样做:
1 | int* ptr; |
缺点是,当声明几个对象时,这会变得混乱。这个
1 | int* a, b; |
将
1 2 | int *ptr; int *a, *b; |
我建议不要在同一语句中声明多个对象。使代码更容易阅读的IMO。而且,它让你可以自由选择任何一种惯例。
更为复杂的是,除了类型修饰符和一元前缀操作符
mytype代表一个/reference/,一个完全不同的指向指针的beast。如果你的函数原型是
FUNC(MyType);
您将使用函数内参数的副本。用
func(mytype&;);
您正在处理对象本身(即调用范围和被调用范围中的同一对象)。在这种情况下,它类似于使用指针,但使用与对象相同的"点"语法。
当然,这是一个肤浅而简单的解释。对我来说,完全掌握指点、参考和其他部落的深层次需要数年时间。