c - 递增内存地址如何影响指针
问题描述
我正在寻找关于增加地址如何影响指针的解释。
通过考虑指针类型,我了解了 C 指针的工作原理以及如何递增指针。还是不明白下面的案例
int main()
{
int a[] = {1,2,3,4,5};
int *p = (int*)(&a+1);
printf("%d\n%d\n", *(a+1), *(p-1));
return 0;
}
我期待这条线
int *p = (int*)(&a+1);
p
指出 array 后面的地址,a
因此我期望输出:
2
因为它很简单a[1]
但输出是unknown_number -因为我不知道哪个 int 落后 4 个字节(&a+1)
实际结果是:
2
5
为什么似乎p
直接指向了坐在后面的记忆a
?
我的困惑的根源是什么?
解决方案
所以在这个例子&a
中是类型int(*)[5]
。当您向其添加 1 时,它实际上会添加sizeof(int[5])
- 因为这就是指针算术的工作方式,添加偏移量会添加指向的类型的大小乘以偏移量。这就是你如何p
成为 的最后一个元素a
,然后将其强制转换为,int*
所以现在你有一个指针指向一个整数,该地址位于 的最后一个元素之后的地址a
。如此有效,从中减去 1 即可得到a
.
推荐阅读
- reactjs - 如何在本地网络上使用 docker 和 PWA 实现持续部署?
- visual-studio-code - 这是 VSCode 中的错误还是功能
- python - 在 Python 函数中,将 pandas 结果写入 CSV
- java - assertThatThrownBy() 检查自定义异常的字段
- sql-update - Teradata 使用具有不同日期的多个 ID 实例的源表更新目标表
- typescript - TypeORM 和 Vue 类组件
- loadrunner - 调用过程会引发错误 ORA-30625: NULL SELF ORA-06512
- java - 相机打开 2 次并崩溃
- r - 如何根据日历周和年份汇总列中的值计数
- terraform - Terraform 解析 Cloudformation 输出