道歉,我感到沮丧,并在没有适当详细信息的情况下通过手机发布了问题
考虑以下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个字节?
现在,您已经给我们提供了代码,我们可以回答您的问题。
因此,令人困惑的是:&arr + i。这并没有按照您的想法做。请记住,&优先于+。这样,您就可以获取地址arr并向前移动i。
指针算术的工作方式是&x + 1将指针向前移动size(x)。那么您的情况是什么size(arr)?它是8,因为它是2的整数数组(我假设int的大小为4)。因此&arr + 1实际上将指针向前移动了8个字节。您体验的确切内容。您不要求下一个int,而是要求下一个array。我鼓励您尝试一下,例如,定义arr为int[3](大小为12)并查看指针如何向前移动12个字节。
因此,第一个解决方案是做arr + i不&。我们可以将指针算法应用于数组,在这种情况下,它会退化为指针类型int*。现在,由于int大小为4,因此可以arr + 1正确指向指向4个字节的内存段。
但是我建议不要使用指针算法,而应该这样做&arr[i]。这样做是一样的,但是IMO不太容易出错,也不会造成混乱,并且可以告诉我们更多有关此意图的信息。
| 归档时间: |
|
| 查看次数: |
85 次 |
| 最近记录: |