C ++内存地址分配

Fai*_*han 0 c++ memory

道歉,我感到沮丧,并在没有适当详细信息的情况下通过手机发布了问题

考虑以下C ++代码:

 int arr[2];
    arr[0] = 10;
    arr[1] = 20;
   // cout << &arr;
    for (int i = 0; i < 2; i++)
    {
       cout << &arr + i << "\t\t"<<endl;
    }

    cout << sizeof (arr);
Run Code Online (Sandbox Code Playgroud)

cout进入for循环打印

0x7ffeefbff580 0x7ffeefbff588

比第一个元素多8个字节

我的问题是,如果在我的机器上sizeof(int)是4,为什么还要再增加8个字节而不是4个字节?

fre*_*ish 5

现在,您已经给我们提供了代码,我们可以回答您的问题。

因此,令人困惑的是:&arr + i。这并没有按照您的想法做。请记住,&优先于+。这样,您就可以获取地址arr并向前移动i

指针算术的工作方式是&x + 1将指针向前移动size(x)。那么您的情况是什么size(arr)?它是8,因为它是2的整数数组(我假设int的大小为4)。因此&arr + 1实际上将指针向前移动了8个字节。您体验的确切内容。您不要求下一个int,而是要求下一个array。我鼓励您尝试一下,例如,定义arrint[3](大小为12)并查看指针如何向前移动12个字节。

因此,第一个解决方案是做arr + i&。我们可以将指针算法应用于数组,在这种情况下,它会退化为指针类型int*。现在,由于int大小为4,因此可以arr + 1正确指向指向4个字节的内存段。

但是我建议不要使用指针算法,而应该这样做&arr[i]。这样做是一样的,但是IMO不太容易出错,也不会造成混乱,并且可以告诉我们更多有关此意图的信息。