*和&应用于变量名时是什么意思?

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

提问人:PUG 提问时间:7/28/2010 最后编辑:sbiPUG 更新时间:8/10/2022 访问量:16413

问:

在 C++ 中,两者之间有什么区别:

 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.
C 指针参考 C++-FAQ

评论

9赞 GManNickG 7/28/2010
你应该得到一本书,它会正确地教你。(而且比我们更好。

答:

30赞 sbi 7/28/2010 #1

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

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

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


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

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

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

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

*并且是一元前缀运算符,用于取消引用并生成 的地址,同时生成数组中的第一个对象。&ppi[]inta

事实上,C 和 C++ 并不关心类型修饰符周围的空格,这导致在放置它们时存在不同的阵营,这并没有真正使事情变得更容易。
有些人将类型修饰符放在靠近类型的位置。他们认为它修改了类型,所以它应该去那里:

int* ptr;

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

int* a, b;

定义为指向 的指针,但定义为 .这就是为什么有些人喜欢写作aintbint

int *ptr;
int *a, *b;

我建议永远不要在同一语句中声明多个对象。IMO 使代码更易于阅读。此外,它让您可以自由选择任何一个约定。


更复杂的是,除了类型修饰符和一元前缀运算符 and 之外,还有二进制中缀运算符 和 ,意思是“按位 AND”和“乘法”。雪上加霜的是,在 C++ 中,您可以为用户定义的类型重载这些运算符的一元前缀二进制中缀变体(以及二进制中缀),并且完全自由地使用它们的语义。&*&*[]

评论

0赞 KedarX 7/28/2010
在第 2 行示例的情况下使用 typedef 到 int* 怎么样?
0赞 sbi 7/28/2010
@Kedar:确实,定义了两个。但我的建议保持不变:每个声明/定义一个变量。typedef int* intptr; intptr a, b;int*
0赞 Andrew 5/27/2021
请注意,您也可以连续取消引用两次(或更多次),例如 获取 for 的值并打印 。int a = 5; int* b = &a; int** c = &b; std::cout << **c;a**c5