c++ - C++ 内存地址分配
问题描述
抱歉,我很沮丧,并在没有适当细节的情况下通过手机发布了问题
考虑以下 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);
cout in for 循环打印如下
0x7ffeefbff580 0x7ffeefbff588
比第一个元素远 8 个字节
我的问题是,如果在我的机器上 sizeof(int) 为 4,为什么它是 8 个字节而不是 4 个字节?
解决方案
现在您给了我们代码,我们可以回答您的问题。
所以令人困惑的是:&arr + i
. 这并不像你认为的那样。请记住,&
优先于+
. 因此,您获取地址arr
并将其向前移动i
。
指针运算的工作方式是&x + 1
将指针向前移动size(x)
. 那么在你的情况下是什么size(arr)
?它是 8,因为它是 2 元素整数数组(我假设整数的大小为 4)。所以&arr + 1
实际上将指针向前移动了 8 个字节。你所经历的确切的事情。你不要求下一个 int,你要求下一个数组。我鼓励您尝试一下,例如定义arr
为int[3]
(大小为 12)并查看指针如何向前移动 12 个字节。
所以第一个解决方案是不arr + i
使用&
. 我们可以将指针算法应用于数组,在这种情况下它会衰减为指针类型int*
。现在因为int
is 的大小为 4 ,所以arr + 1
正确指向向前 4 个字节的内存段。
但我建议的是远离指针算术,&arr[i]
而是这样做。这做同样的事情,但 IMO 更不容易出错,更少混淆,并告诉我们更多关于意图的信息。
推荐阅读
- java - 在 Here-maps 上添加 SVG 图像
- laravel - 在 laravel 中出现错误:无法下载“https://packagist.laravel-china.org/packages.json”文件
- vue.js - 我的 vuetify CSS 对我的项目没有生效
- javascript - jQuery保存数据并加载每个刷新页面
- java - 新行可用时如何不断保持按钮字体大小
- java - 在适配器内打开一个对话框,返回空值
- nginx - nginx反向代理没有检测到负载均衡器
- r - R purrr 从两个列表中逐行查找
- php - 注销后如何将用户引导至主页
- python - 我的 python 程序的机器码表示