我几天前刚刚开始学习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 的唯一情况
在声明上下文中,*
是指针,&
是引用,它们根本不是逆。