提问者:小点点

在C++中递增一个整数指针,并将递增指针的值赋给另一个变量


我在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的值是一个随机垃圾值。 为什么会这样呢?


共3个答案

匿名用户

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。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|中|递增|整数|指针|并将|递增|指针|值|赋|变量)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?