C++ & 和 * 运算符在所有上下文中都是反向的吗?

Are the C++ & and * operators inverses in all contexts?

本文关键字:上下文 运算符 C++      更新时间:2023-10-16

我几天前刚刚开始学习C++(来自C#背景),现在正经历着指针和引用等方面的头痛。)在阅读了SO和维基百科等现有文献后,我想我现在已经在脑子里想好了,但我想看看我是否在这里找到了。如果下面有什么不正确的地方,请纠正我。

当作为前缀应用时,我收集&获得变量的地址,而*取消引用它(如果变量是指针)。取消引用不是指针的变量是非法的,因此运算符定义了从原始对象级别开始并在&方向上无限期持续的"指针性"阶梯上下转换。在这个意义上,运算符在这个上下文中是逆的。

现在,我还看到,在声明变量时,我们可以等价地编写

int *newVariable;

int* newVariable;

并且类似于CCD_ 4(并且实际上具有围绕CCD_。

前者被解释为*与以前一样对变量进行操作:"声明一个变量‘newVariable’,这样当它被取消引用时,它指向一个int"。这使它成为int指针。

后者被解释为对类型int进行操作的*,其含义被定义为T*是指向T的指针:"声明一个变量'newVariable',它是指向一个int的指针"。

这表明,我们对它们作用于变量的相同关系延伸到它们作用于类型的时候。这给我带来了一些困惑,因为与*不同,&似乎是不一致的,并在这里改变了它的行为,因此前面对上述声明的解释不适用于&*

这个上下文中,即对类型或其声明中的变量进行操作,它似乎不再具有相同的含义,因此不再是*的逆运算。这里,&声明一个变量作为对该类型的引用,该类型与"pointerness"梯形图正交。您可以具有对梯形图上任何类型的引用,但不能具有指向引用的指针,也不能具有对引用的引用。因此,声明中的运算符组合必须是一个(可能为空)*s的字符串,后面可能跟一个&

分配引用的语法与原始对象的语法相同-如果分配给另一个引用,那么它将指向其他引用指向的对象。此外,引用不能用*取消引用-相反,编译器会自动取消与引用的每次交互,这样你就可以像处理对象本身一样处理它。

此外,当通过函数参数传递变量时,如果原始对象不是引用,则它总是在内存中浅层复制到函数作用域中的新变量(在指针的情况下,这只是意味着复制了地址)。如果它是一个引用,那么函数只会接收一个新的引用对象,该对象指向与它接受的引用相同的对象,因此这与.Net.中的值类型和引用类型的工作方式大致相同

所有这些听起来大致正确吗?

谢谢!(我知道这并不是这个话题的第一个问题…)

int *newVariable;

int* newVariable;

都是一样的东西。也是如此

int& newReference;
int &newReference;
int & newReference;

一旦你声明了引用,你就可以把它想象成实际的变量本身。所以你不需要特定的操作员来取消引用它。

当通过函数参数传递变量时,原始对象是总是在内存中浅层复制到函数中的新变量范围,如果它不是引用(在指针的情况下,这只是意味着地址被复制)。

当通过函数参数传递变量时,这完全取决于函数如何获取该变量。即功能定义:

所以这两者之间有区别:

void func(int parameter);

这个:

void func(int & parameter);

第一个只是将参数复制到函数范围,因此参数的任何更改都不会影响您传递的实际变量。但在第二个的情况下,它是func()获取的引用,因此它的更改也会影响您的变量。

C++和;和*运算符在所有上下文中都反转?

不,一点也不。根据上下文的不同,这些运算符有不同的含义,而且这些含义并不总是相反的。

在表达式上下文中,*是乘法或解引用,而&是的地址。的去引用和地址是反转的,这实际上是*&是invereses 的唯一情况

在声明上下文中,*是指针,&是引用,它们根本不是逆。