不接触变量 C++ 的 cout 值

cout value without touching variable C++

当我运行程序时,它打印变量a的值。但是当我评论行 'cout<<&b<<endl<<&a<<endl;' 时,它会打印一个垃圾值。 背后的解释是什么?

#include<iostream>
using namespace std;

int main()
{
    int a = 9;
    int b = 10;
    int *pb = &b;
    cout<<&b<<endl<<&a<<endl;
    cout<<*(pb+1);
}

你屏幕上的垃圾值是 a 和 b 的地址。你应该试试这个:

int *pb = &b;

有两个地方可以获得 "gibberish" 值,但实际上只有一个地方是打印垃圾的地方。

cout << &b << endl << &a << endl; 将使用address-of-operator 打印ab 的地址。您看到的不是 ab 的值,而是它们存储在内存中的位置。这些是十六进制值,每次您 运行 程序时它们可能会改变。这是预期的行为。

然后是这个构造:*(pb + 1),它实际上调用了未定义的行为。但这是为什么呢?首先 pb 是一个指针,所以它存储一个地址,更具体地说是存储 b 的内存地址。您可以直接打印出 pb,这将导致与 cout << &b 相同的结果,或者使用取消引用运算符 * 取消引用它。所以这个 cout << *pb 会打印值而不是 pb 指向的地址(10 btw)。现在你的陈述有什么问题 - (pb + 1) 不是增加 pb 指向的值,而是增加存储在 pb 中的地址。所以它不再指向 b 的值,而是指向内存中某处的其他值。然后你取消引用这个地址并读取一些随机值 - 这是你的 "garbage" 值。

您可能想要增加 pb 指向的值。所以 cout << (*pb + 1) 将打印 11 (注意括号的位置)。但是 cout << b 仍然会导致 10。如果你真的想改变 b 的值,你可以这样做:

int b = 10;
int *pb = &b;
*pb += 1;
cout << b;

现在 b 增加了 1 而没有触及 b 本身。

当您打印 ab 的地址时,这会强制变量实际具有内存地址。否则,一个值可能会存储在寄存器中,或者如果从未使用过则根本不会存储。

编译器转换是一个很常见的优化

const int a = 9;
cout << a;

进入

cout << 9;

永远不要在任何地方存储 a

无论如何,没有规则说明变量存储在内存中的位置和顺序。这完全取决于编译器。所以你的假设&a == &b + 1(或&b - 1)是无效的。