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

时间:2015-12-29 03:22:41

标签: c++ pointers reference dereference

我几天前刚刚开始学习C ++(来自C#背景),并且在掌握指针和引用等的那一刻我正在经历头痛。(不,我从未使用指针C#和我现在只使用它们,因为看起来多态性在C ++中依赖于它们,快乐。)我想在阅读了一些关于SO和维基百科等的现有文献之后,我已经全力以赴了,但我想检查一下如果我在这里做到了如果以下任何内容不正确,请纠正我。

我在作为前缀&应用时收集获取变量的地址,而*取消引用它(如果变量是指针)。取消引用不是指针的变量是非法的,因此操作符在原始对象级别从“{1}}方向无限期地继续定义”指针“梯形图上下的转换。从这个意义上讲,运营商在这种背景下是逆向的。

现在,我也看到在声明变量时我们可以等效地写

&

int *newVariable;

,类似于int* newVariable; (实际上&周围有任何间距,因为它可以等效地解决到这两种情况)。

前者被解释为对变量进行操作的*,如前所述: “声明一个变量'newVariable',这样当它被解除引用时,它指向*”。这使它成为int指针。

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

这表明我们对变量采取的相同关系会延伸到它们对某个类型的行为时。这给我带来了一些困惑,因为它似乎与int不同,*不一致并且在此更改其行为,以致上述声明的前解释也不适用于&&

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

分配引用的语法与原始对象的语法相同 - 如果分配给另一个引用,则指向它指向另一个引用所指向的对象。此外,无法使用&取消引用引用 - 相反,编译器会自动取消引用与引用的每次交互,因此您可以像对象本身一样对其执行操作。

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

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

谢谢! (我知道这不是关于该主题的第一个问题......)

2 个答案:

答案 0 :(得分:2)

int *newVariable;

int* newVariable;

是一回事。所以:

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

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

  

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

通过函数参数传递变量时,一切都取决于函数如何获取该变量。即功能定义:

所以这之间存在差异:

void func(int parameter);

和此:

void func(int & parameter);

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

答案 1 :(得分:2)

  

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

不,一点也不。这些运算符具有不同的含义,具体取决于上下文,这些含义并不总是反转。

在表达式上下文*是乘法或取消引用,而&是地址。取消引用和地址是反转的,这实际上是*&一直存在的唯一情况

在声明上下文中,*是指针,&是引用,而这些并不是所有的反转。