使用引用变量和指针
Playing with reference variables and pointers
-
int &y=x
和int y=&x
相同吗? -
s++
和*s++
相同吗? -
同样在下面的代码中,为什么
*s++
给了我一些错误的结果?我原以为
*s
的值是12
#include <iostream>
using namespace std;
int main()
{
int p=10;
int &q=p; //q is a reference variable to p
//int r=&p; //error: invalid conversion from 'int*' to 'int'
int *s=&p; //valid
q++;
*s++; //here even s++ works, and cout<<*s does not give 12 but some lengthy number
//and cout<<s gives some hexadecimal, I'm guessing thats the address
cout<<p<<endl<<q<<endl<<*s;
}
我得到的输出:
11116422280
CCD_ 7与CCD_。
在第一个CCD_ 9中是一个被初始化为CCD_。OTOH,在第二秒内,您试图为int
分配一个值int *
,这会导致编译错误。
为什么*s++给了我一些错误的结果?我原以为*s的值是12
这是因为++
优先于*
,因此,第一个s
首先递增(因此指向未初始化的内存位置),然后取消引用。
这导致未初始化内存位置的取消引用,导致未定义的行为。
如果你想要期望值,你可以这样做-
(*s)++; //dereference first and then increment
int &y=x
和int y=&x
相同吗?
没有。他们非常不同。
int x;
int& y = x; // y is a reference to x.
另一方面,
int x;
int y = &x; // Should be compiler error.
// Initializing y with a pointer.
线路:
*s++;
相当于:
int* temp = s;
s++;
*temp;
您正在评估*temp
,但副作用是您正在增加s
。之后,CCD_ 20指向下一个元素。但这不是一个有效的地址。下次访问*s
时,程序将显示未定义的行为。线路输出:
cout<<p<<endl<<q<<endl<<*s;
可以是任何东西。
int &y=x
与intint y=&x
相同吗?
不太可能。第一个将x
绑定到int
-引用y
,第二个用地址x
初始化int
-y
。
两者都可以干净地编译,但第二个只有严重扭曲滥用运算符重载:
{
int y;
int& x = y;
}
{
// Only for demonstration, never do something this crazy for real
struct { int operator&() { return 0; }; } x;
int y = &x;
}
s++
和*s++
相同吗?
当然不是,尽管它们在您的示例中具有相同的效果,因为您放弃了结果:
- 第一个递增CCD_ 32并返回其递增前的值
- 第二个做了同样的事情,但随后取消了引用
在这两种情况下,s
此后都指向对象后面,并且可能不会因未定义行为(UB)而被取消引用
这解释了你得到的奇怪数字,但也可能导致你的程序只打印42
,然后开始重新格式化你的硬盘(合法但不太可能)。
相关文章:
- 指针变量在 cout 函数中不起作用
- 如何将指针变量作为引用参数传递?
- 有没有办法在同名类 (c++) 中为对象分配一个指针变量
- 我试图了解在异或操作后指针变量正在更改
- 调用带有指针对象错误的指针变量
- 如何在 cuda 中将结构的指针变量从主机复制到设备
- 非指针变量和类成员上的新放置
- 线路抑制状态错误 C4703 可能未初始化的局部指针变量"back"已使用
- 全局外部指针变量在 DLL 中不可见
- 如何访问在 c++ 中在类内声明的结构类型指针变量?
- C++ 中指针变量的内存释放
- 使用指针变量打印特定的数组变量
- 如何使用构造函数初始化内存地址(指针变量)?
- 如何释放为指针变量本身提供的内存?
- 如果地址已知,如何获取指针变量的名称
- 如何处理参数中的基类和指针变量
- 指针变量 在数组中定位零
- 隐式指针变量,在自动定义中具有另一个指针变量
- 为什么可以将Char指针变量初始化为字符串,而INT指针变量不能初始化到整数数组
- 错误 C4703 可能未初始化的局部指针变量'y'使用