在此代码中,我首先描述了int a并为其分配了值9,然后声明了另一个int b,然后给*(&b-1)赋予了值3,因此(&b-1)引用了&a然后我打印a的值,然后只打印9,但是当我在代码中添加新行(第6行)时,即先打印a,然后将值3分配给(&b-1),然后将a更新为3并打印它。那么为什么会这样呢?
#include <iostream>
using namespace std;
int main() {
double a, b;
a = 9;
//cout<<&a<<" "<<a << endl ;
*(&b - 1) = 3;
cout << a << " " << &b - 1 << " ";
cout << &a;
}
答案 0 :(得分:4)
所以(&b-1)是指&a
不,那不是C ++的工作方式。
您不能像这样“导航”堆栈框架,因为C ++是一种抽象并且没有堆栈框架。
您在这里所做的是假装b
是指向数组第二个(或更高版本)元素的指针,并尝试获取该数组中前一个元素的值。我们知道,您实际上没有数组。
那为什么会这样呢?
这就是原因。您对编译器撒谎了,现在它吓坏了。
是的,它确实在乎这种事情!
答案 1 :(得分:3)
您的问题基于错误的前提
[...](&b-1)表示&a [...]
那是错的。所以当你...
*(&b - 1) = 3;
您正在取消引用不允许取消引用的指针。 double
上没有存储(&b - 1)
。由于这是未定义的行为,因此您的程序可以执行任何操作,而关于代码的操作就可以说很多。)