arrays - 为什么我在二维数组中得到“a+1”和“&a+1”的不同结果?
问题描述
#include<stdio.h>
#include<conio.h>
int main()
{
int a[3][4] = {1, 2, 3, 4, 4, 3, 2, 1, 7, 8, 9, 0};
clrscr();
printf("%u \n",a);
printf("%u, %u\n", a+1, &a+1);
getch();
return 0;
}
输出:65502 65510 65526
sizeof(int)=2
如果基地址为,该程序如何工作65502
?
解决方案
当你在表达式中使用数组a
时,它通常会经历“指针衰减”,这意味着你会得到一个指向数组第一个元素的指针。
所以,a
有 type int[3][4]
,它衰减到int (*)[4]
。当你写的时候a+1
,你会得到a[1]
…的地址,它是sizeof(*a)
之后的字节a
,也就是sizeof(int)*4
,在你的系统上是 8。
使用 时&
,不会发生指针衰减。&a
不是一个数组(它已经是一个指针),所以当你写的时候,你得到的地址是……&a+1
的“结束后”的地址,它是a 之后的字节,即,或系统上的 24 个字节。a
sizeof(a)
sizeof(int)*12
请注意,严格来说,打印指针的正确方法是使用%p
.
printf("%p\n", a);
printf("%p, %p\n", a+1, &a+1);
(从技术上讲,您还必须转换为char *
orvoid *
但这并不重要。)
推荐阅读
- xamarin.forms.listview - Json 到列表视图转换检索 xmarian.forms 跨平台中的空值
- tensorflow - 我可以在 tensorflow 中同时使用热图像和 RGB 图像来训练物体检测器吗?
- javascript - React 组件,或从类似于 react-intl 的存储数据中替换字符串文字的策略
- amazon-web-services - 找到所有aws公共资源的方法?
- openlayers - 将 SideBar 用于 openlayers 时出错
- javascript - 在 Flask 中,如何将变量从模板传递给 Python?
- sql - 带有条件的 SQL 表值的 MAX 或 MIN
- timer - IBM Liberty Profile 18.0.0.1 上的非持久性 timerService 注入失败
- login - 随时随地自动登录
- python-3.x - 如何提取服务器用 Python 请求发送的 cookie