数组名和数组名取地址的区别
2015-09-18 13:00
225 查看
#include <stdio.h>
int main()
{
int a[5];
printf("%d\n", a);
printf("%d\n", &a);
printf("%d\n", a + 1);
printf("%d\n", &a + 1);
printf("%d\n", &a[0] + 1);
printf("---------------\n");
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(&a));
return 0;
}
运行结果:
![](http://s12.sinaimg.cn/middle/7e40ef214c498f465757b&690)
分析:
由运行结果可知,数组名a和&a得内存地址相同。我们由数组和指针的关系知道,a代表这个数字,它相当于一个指针,指向第一个元素(&a[0]),即指向数组的首地址。数组中的其他元素可以通过a的位移得到,此时的进阶是以数组中单个的元素类型为单位的。所以有a+1为1245040,即数组中a[1]的地址是1245040(在首地址1245036基础上加int的字节数4得到的)。
然而,&a代表的不是取a这个变量的地址,而是取数组元素的地址。虽然&a和a得内存地址相同,但它们的意义不相同,它是代表整个数组的,它的进阶单位是整个数组的字节长度(这里是4*5=20),所以&a+1得内存地址为1245056。
其实,a的类型是int[5] 数组
&a的类型是int(*)[5] 指针——指向int[5]数组的指针
&a[0]的类型是int* 指针——指向int类型的指针
另外,当用sizeof时,由于它是个关键词,而不是个函数,所以数组不自动转换为指针,得到的结果是数组的长度*数组中元素类型所占的字节数,本例中sizeof(a)和sizeof(&a)都是20.
ps:如果是(int)a +1,则结果是1245037(即1245036+1)
int main()
{
int a[5];
printf("%d\n", a);
printf("%d\n", &a);
printf("%d\n", a + 1);
printf("%d\n", &a + 1);
printf("%d\n", &a[0] + 1);
printf("---------------\n");
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(&a));
return 0;
}
运行结果:
分析:
由运行结果可知,数组名a和&a得内存地址相同。我们由数组和指针的关系知道,a代表这个数字,它相当于一个指针,指向第一个元素(&a[0]),即指向数组的首地址。数组中的其他元素可以通过a的位移得到,此时的进阶是以数组中单个的元素类型为单位的。所以有a+1为1245040,即数组中a[1]的地址是1245040(在首地址1245036基础上加int的字节数4得到的)。
然而,&a代表的不是取a这个变量的地址,而是取数组元素的地址。虽然&a和a得内存地址相同,但它们的意义不相同,它是代表整个数组的,它的进阶单位是整个数组的字节长度(这里是4*5=20),所以&a+1得内存地址为1245056。
其实,a的类型是int[5] 数组
&a的类型是int(*)[5] 指针——指向int[5]数组的指针
&a[0]的类型是int* 指针——指向int类型的指针
另外,当用sizeof时,由于它是个关键词,而不是个函数,所以数组不自动转换为指针,得到的结果是数组的长度*数组中元素类型所占的字节数,本例中sizeof(a)和sizeof(&a)都是20.
ps:如果是(int)a +1,则结果是1245037(即1245036+1)
相关文章推荐
- hibernate
- 在需求分析中就可以避免的那些错误13
- Font Style
- 【 Android官方文件读书笔记】连接网络
- maven构建的模块化的JavaWeb工程
- Ubuntu安装Tomcat
- Intellij IDEA 基本设置
- 系统分析工具
- ios网络判断的方式
- 添加新图层的时候修改配置
- RPM使用说明总结
- 内存泄露
- 基础的JavaScript编码规范
- In SQL, what’s the difference between a full join and an inner join?
- 新建maven工程
- json-simple简明教程
- WebService学习笔记(八)Spring与CXF整合客户端
- HDU 5062 Beautiful Palindrome Number(数学)
- nyoj43 24 Point game
- POJ 3320 Jessica's Reading Problem