C 内存地址分配

C++ Memory Address Allocation

本文关键字:分配 地址 内存      更新时间:2023-10-16

很抱歉,我感到沮丧,并通过移动没有适当的详细信息发布了问题

考虑以下C 代码:

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

cout in for loop打印

0x7ffeefbff580 0x7ffeefbff588

比第一个元素

更远

我的问题是,为什么在我的机器大小(int(上是4个字节,而不是4个字节

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

所以令人困惑的是: &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的错误较小,不容易发生,不那么令人困惑,并告诉我们更多有关意图的信息。