数组与指针,&a和a
来源:互联网 发布:厨艺软件 编辑:程序博客网 时间:2024/06/05 15:41
今天无意中看到一道题目,考察的是数组与指针,如下
int a[5] = {1,2,3,4,5};int *ptr1 = (int *)(a + 1);int *ptr2 = (int *)(&a + 1);printf("%d %d\n" , *ptr1, *(ptr2-1));初一看,我想的答案是2,1,因为a是数组名称,也就是数组的首地址,a+1指向的就是数组的第二个元素了,也就是2,所以打印的是2,&a+1也是这样理解的,先+1再-1,那应该输出的是数组的第一个元素了,但是上机运行,输出的是2,5,感觉很不解,于是用了下面这个语句去查各个元素分配的地址
printf("%p %p %p %p %p %p %p %p %p\n", a, &a, &a[0], &a[1], &a[2], &a[3], &a[4], ptr1, ptr2);打印出来的结果是0022FE84 0022FE84 0022FE84 0022FE88 0022FE8C 0022FE90 0022FE94 0022FE88 0022FE98
从这个结果可以看出a,&a[0],&a这三者在数值上是一样的,都表示了数字a的首地址,但是a+1和&a+1的结果却是完全不同的,后来查了资料,原来a的数据类型是int *,而&a的数据类型是int (*)[5],于是sizeof(&a)=5*sizeof(int)=20,所以&a+1实际上跳过了整块的a所分配的内存地址,也就是越界了,ptr2-1将指针拉回到数组a所在的地址区域,指向了a[4],所以会输出5,至此这道题我算是理解了。从这里看出,C语言中的指针真的是很灵活,需要用心去体会了。
0 0
- 数组与指针,&a和a
- 指针与数组--a与&a区别
- C,数组指针,*(a+i)与*a+i;
- 给出a的定义 -- 指针 和 数组
- 如何理解指针和数组char * a, char ** a, char * a[], char a[][], char * a[][], char ** a[][], char * a [][][]
- 数组a与&a
- char a[](字符串数组)和char *a(字符串指针)区别
- char a[](字符串数组)和char *a(字符串指针)区别
- char a[](字符串数组)和char *a(字符串指针)区别
- [C/C++]数组与指针——a,a[0],&a,&a[0]区别小结
- 数组和指针的区别(a和&a以及&a[0]的区别)
- 数组和指针的区别(a和&a以及&a[0]的区别)
- const int *a, int const *a,int * const a,区别,指针数组,数组指针,声明与定义
- const int *a, int const *a,int * const a,区别,指针数组,数组指针,声明与定义(转)
- const int *a, int const *a,int * const a,区别,指针数组,数组指针,声明与定义
- const int *a, int const *a,int * const a,区别,指针数组,数组指针,声明与定义
- const int *a, int const *a,int * const a,区别,指针数组,数组指针,声明与定义
- const int *a, int const *a,int * const a,区别,指针数组,数组指针,声明与定义
- 关于单片机编程与其调试的零散知识收集
- 《Andorid开发艺术探索第七章》-动画
- php编译安装与配置
- Web分页实现及实例演示(二)——MySql limit
- 学习Android onTouch偶然遇到的关于获取点击坐标(getX(),getY())的问题
- 数组与指针,&a和a
- android 颜色的表
- Java(继承的实现)
- STM32启动文件总结
- 使用Android开发测试纯Java工程代码
- 《Java SE》初学Java
- wlan之11n速率计算
- 使用Jenkins搭建Android自动化构建--配置篇--windows
- 【Unity探究】物理碰撞实验