C ++内存地址分配

时间:2019-07-01 21:43:04

标签: 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);

在以下循环中打印出

  

0x7ffeefbff580 0x7ffeefbff588

比第一个元素多8个字节

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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

但是我建议不要使用指针算法,而应该使用&arr[i]。这样做是一样的,但是IMO不太容易出错,也不会造成混乱,并向我们介绍了更多意图。