有两个点在那里你可以得到“胡言乱语”的价值观但是其中只有一个是actualy其中垃圾被打印出来。
这个cout << &b << endl << &a << endl;
将通过使用操作符地址打印地址a
和b
。你看到的不是a
和b
的值,而是存储在内存中的位置。这些是十六进制值,每次运行程序时它们可能都会更改。这是预期的行为。
然后有这个构造:*(pb + 1)
这实际上是调用未定义的行为。但为什么呢?首先pb
是一个指针,所以它存储一个地址,更具体地说是存储地址b
。您可以直接打印出pb
,这会得到与cout << &b
相同的结果,也可以使用取消引用运算符*
对其进行解引用。所以这cout << *pb
将打印的值不是地址pb
指向(10
btw)。现在你的声明有什么问题 - (pb + 1)
是不是增加值pb
是指向但地址保存在pb
。因此它不再指向b
的值,而是指向内存中的某个其他值。然后你解引用这个地址并读取一些随机值 - 这是你的“垃圾”值。
你可能想要的是增加pb
指向的值。所以cout << (*pb + 1)
将打印11
(注意括号放置在哪里)。但cout << b
仍然会导致10
。如果你想真正改变的B您可以做到这一点的价值:
int b = 10;
int *pb = &b;
*pb += 1;
cout << b;
现在b
增加了一个不接触b
本身。
*未定义的行为* - '*(pb + 1);'访问“越界” – UnholySheep
这是未定义的行为,一切都会发生。并且调用约定与此有什么关系 –
因为'pb'指向一个* single *'int'变量。当你执行'*(pb + 1)'时,它等于'pb [1]',它试图使用'pb'作为数组并且在数组中打印第二个*值。这超出了'pb'指向的范围,并导致*未定义的行为*。未定义的行为会导致您的整个程序*不合格*并且无效。 –