有关a和&a[0]的问题
在课程中,老师说a和&a等价,这点我可以理解,并且通过代码可以验证
通过编译器警告,可以看到a和&a[0]都是int *类型。但是老师在后面说a是一个int [5]类型的数组
在这里有些不理解,为什么a的类型变成了int [5]?
27
收起
正在回答
2回答
可以粗略这样理解吧!因为数组是一个比较特殊的东西!可以从一维数组来理解!
int a[5] ;
int *p = a;
int. *p = &a[0];
因为这里其实有个编译器转化的,p本质保存的是a[0]的地址!
int (*p)[5] = &a;
理解了一维,二维是一样的!
int a[3][2] ;
int *p[2] = a;这里本质也是保存a[0]的地址
int a[5] ;
int *p = a;
int. *p = &a[0];
因为这里其实有个编译器转化的,p本质保存的是a[0]的地址!
int (*p)[5] = &a;
理解了一维,二维是一样的!
int a[3][2] ;
int *p[2] = a;这里本质也是保存a[0]的地址
大白老师
2023-07-23 10:26:47
首先明确一个规定,属于名代表数组首元素的地址!
int a[5];
a<==>&a[0]
注意这里的等价只是说的数值上的等价,并没有说类型等价!
换句话说假设a[0]的地址是0x9000,那么a的值也是0x9000。这里只是值相等!但是类型不是这么看的!
类型的确定:把变量名去掉后剩下的就是类型。
int a[5];变量a去掉后就是int [5]。
还有种理解,a的类型是整个数组,5个int
要不怎么理解,sizeof(a)输出是20byte,整个数组的大小!
在教你一种简单的验证方式.代码中输出下面的话!标准器会有警告提示具体类型。
printf("a = %#x\n",a);
printf("&a[0] = %#x\n",&a[0]);
int a[5];
a<==>&a[0]
注意这里的等价只是说的数值上的等价,并没有说类型等价!
换句话说假设a[0]的地址是0x9000,那么a的值也是0x9000。这里只是值相等!但是类型不是这么看的!
类型的确定:把变量名去掉后剩下的就是类型。
int a[5];变量a去掉后就是int [5]。
还有种理解,a的类型是整个数组,5个int
要不怎么理解,sizeof(a)输出是20byte,整个数组的大小!
在教你一种简单的验证方式.代码中输出下面的话!标准器会有警告提示具体类型。
printf("a = %#x\n",a);
printf("&a[0] = %#x\n",&a[0]);
物联网/嵌入式工程师
- 参与学习 394 人
- 提交作业 22954 份
- 解答问题 1163 个
行业热门,政策风口,人才缺口极大,现在入场时机正好! 上千人检验,数轮迭代的硬核知识体系,软硬件通吃 保姆式教学+简历指导+1V1模拟面试+3次内推,助力轻松就业!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星