gpt4 book ai didi

c++ - 应用于变量名时 * 和 & 的含义是什么?

转载 作者:IT老高 更新时间:2023-10-28 22:34:10 31 4
gpt4 key购买 nike

在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.

最佳答案

一元前缀运算符&,当应用于对象时,会产生地址 对象:&obj.
类型修饰符&,当应用于即将声明的变量时,会将变量的类型修改为引用类型:int&

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

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


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

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

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

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

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

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

int* ptr;

缺点是在声明多个对象时会变得困惑。这个

int* a, b;

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

int *ptr;
int *a, *b;

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


更复杂的是,除了类型修饰符一元前缀操作符&*,还有 二元中缀运算符 &*,意思是“按位与”和“乘法”。雪上加霜的是,在 C++ 中,您可以 overload 这些运算符的 一元前缀二元中缀 变体(以及 二元中缀 [ ]) 用于用户定义的类型,并且对其语义完全免费。

关于c++ - 应用于变量名时 * 和 & 的含义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3350626/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com