数组名和数组名取地址的区别
2016-06-28 09:06
253 查看
int main() { int a[3]={1,2,3}; 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("%d\n",(int)a+1); return 0; }
分析:
由运行结果可知,数组名a和&a得内存地址相同。我们由数组和指针的关系知道,a代表这个数字,它相当于一个指针,指向第一个元素(&a[0]),即指向数组的首地址。数组中的其他元素可以通过a的位移得到,此时的进阶是以数组中单个的元素类型为单位的。所以有a+1为2686648,即数组中a[1]的地址是2686648(在首地址2686644基础上加int的字节数4得到的)。
然而,&a代表的不是取a这个变量的地址,而是取数组元素的地址。虽然&a和a得内存地址相同,但它们的意义不相同,它是代表整个数组的,它的进阶单位是整个数组的字节长度(这里是4*3=12),所以&a+1得内存地址为2686656。
其实,a的类型是int[3] 数组
&a的类型是int(*)[3] 指针——指向int[3]数组的指针,所以+1相当于加上3个int型的长度
&a[0]的类型是int* 指针——指向int类型的指针,所以+1相当于加上1个int的长度
(int)a+1 将ad地址转换成int型,+1,就是整型数+1
相关文章推荐
- PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
- 深入理解数组指针与指针数组的区别
- 数组指针、指针数组以及二位数组的深入解析
- c--》为指针数组分配内存并且赋值0-99
- 封装好的Folyd建图,C++源码
- matlab与c/c++混合编程
- matlab与c/c++混合编程——c/c++调用matlab
- C/C++常用的调试宏
- VC内存泄露检查工具:VisualLeakDetector
- 内联函数总结
- usb体系结构
- VC结构体实现类似数组的下标操作符功能
- C/C++ 嵌套结构体动态内存管理实现
- C++调用gSoap编写的WEBSERVICE与C#.NET间接口自定义结构体不能重复使用
- 处理VC开发的webservice在C#.NET中中文乱码问题
- gcc使用入门
- C/C++ Linux 程序员必须了解的 10 个工具
- 递归遍历数组
- 指针数组,数组指针、指针函数,函数指针
- 二级指针的应用