我在Microsoft Visual Studio中编写了以下代码:
#include <iostream>
using namespace std;
int main()
{
int i = 1;
int *p;
int val;
p = &i;
*p = 101;
val = *(p + 2);
cout << val << endl;
cout << i << endl;
return 0;
}
在val=*(p+2)
行中,由于*(p+2)
返回p所指向的整数之后的第二个整数的值,而p当前指向整数101,因此我期望val的值为101+4×2=109。
当我在Visual Studio中执行代码时,输出显示变量val的值是一个随机垃圾值。 为什么会这样呢?
p当前指向整数101,我预期val的值为101+4×2=109。
你的期望毫无根据。
因为*(p+2)返回p所指向的整数之后的第二个整数的值
如果p
指向数组的元素,则这是正确的。 但它不指向数组的一个元素,因为它不指向数组的一个元素,所以也就不存在“在p所指向的一个整数之后的第二个整数”。
为什么会这样呢?
因为程序的行为是未定义的。
和val=*(p+2);
不指向i=101
之后的第二个整数的值。 p
指针在内存中有它自己的内存地址,当您写p+2
时,您前进了两个内存地址,等于您的指针在内存中的大小乘以2。 因此val
在(p+2)地址获取值,这是垃圾。 签出cout<<<;
cout<<; &(P+2)
。 它们是不同的,一个指向i
,另一个保存垃圾值。
你全弄错了。
p指向I。 它意味着p存储I的地址。 究竟是哪一个位置,是无法预测的。 可能是123456。 我们只知道在这个地址上写着数字101。
*(p+2)是存储在内存中i后2位的整数。 例如,如果我有地址123456,整数是4字节,那么(p+2)是地址123464处的整数(即123456+24)。 这里储存了什么,以及为什么,是不可预测的。
就像你住在飞天马卡龙怪兽路一样。 12345,我不知道谁住在飞天马卡龙怪兽路。 12346或Flying Macaron Monster路。 12347。