道歉,我感到沮丧,并在没有适当详细信息的情况下通过手机发布了问题
考虑以下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个字节?
答案 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不太容易出错,也不会造成混乱,并向我们介绍了更多意图。