C语言数组指针问题
来源:互联网 发布:win10怎么新建网络连接 编辑:程序博客网 时间:2024/05/22 13:07
在网上看到一个这样代码:
int main{ int a[5] = {1,2,3,4,5}; int *str = (int *)(&a+1); printf("%d\n%d\n", *(a+1), *(str-1)); return 0;}
我一开始也陷入了陷阱里,没想这一个数组指针,以为只是普通的首地址加上一个数据类型的字节,于是我开始进行了下面一系列的实验:
#include<stdio.h>int main(void){ int a[5] = { 1,2,3,4,5 }; int *b = (int*)(&a+1); for (int count = 0; count < 6; count++) { printf("&a[%d]=%d\n", count, a + count); printf("&a[%d]=%d\n", count, &a[count]); } printf("\n"); printf("b=%d\n",b); printf("b-1=%d\n", b-1); printf("*b=%d\n",*b); printf("*b-1=%d\n",*b-1); printf("*(b-1)=%d\n",*(b-1)); return 0;}
打印出来的结果如图一所示:
因为指针类型是int*类型,所以在每+1为4个字节(编译环境:VS2015)。b和a[5]的地址相同,其实这个写法是错的,会越界。b-1和a[4]地址相同。所以可以看出这个+1加的&a是整一个数组的长度。
那是不是这样呢?我们把上面的printf(“&a[%d]=%d\n”, count, a + count);改成printf(“&a[%d]=%d\n”, count, &a + count);
打印结果如图二所示:
可以看到&a+1之间是以20个字节为单位,&a[1]之间以4个字节为单位。证明我上面说的,那+1该加多少呢?是不是与前面的地址所指的长度有关?我们把上面的printf(“&a[%d]=%d\n”, count, &a + count);改成printf(“b + %d =%d\n”, count, b + count);,我们来看一下结果:
我们可以看到第一个b+0还是&a[5]的地址,那为什么后面是以4个字节为单位呢?而不是以20个字节呢?那是因为在定义b这个指针的时候,把他的类型转换成了int*型(int b=(int)(&a+1));所以现在可以证明:+1要加多少跟+1前面的指针类型有关系。
那二维数组的时候,情况又是怎么样的呢?我又写了以下的程序进行测试:
#include<stdio.h>int main(void){ int a[3][3] = { { 1,2 },{ 3,4 },{ 5,6 } }; int *b = (int*)(&a + 1); for (int c = 0; c < 3; c++) for (int d = 0; d < 3; d++) printf("&a[%d][%d]=%d\n", c, d, &(a[c][d])); printf("\n"); for (int count = 0; count < 3; count++) { printf("a + %d=%d\n", count, a + count); printf("&a[%d]=%d\n", count, &a[0] + count); } printf("\n"); printf("&a[2][1]=%d\n", &(a[2][1])); printf("b=%d\n", b); printf("b-1=%d\n", b - 1); printf("*b=%d\n", *b); printf("*b-1=%d\n", *b - 1); printf("*(b-1)=%d\n", *(b - 1)); return 0;}
结果如图四所示:
我们可以看出a+count是以12个字节为单位,因为我们定义的是int型3*3的二维数组,所以一行为12。在二维数组的指针中a=&a[0][0],a+1=&a[1][0],依此类推。
我们现在把printf(“a + %d=%d\n”, count, a + count);改成printf(“&a + %d=%d\n”, count, &a + count);看看是不是以3*3*4=36个字节为单位递增,我们打印看一下结果:
看来我们的推导是正确的,果然是以36个字节为单位递增。所以:+1要加多少个字节跟+1前面的指针类型有关系。&a是数组指针,代表数组的总长度,所以&a+1中的1为数组a所占的内存。而a+1中的a跟&a[0][0]是一样的,都表示的是数组的首地址,所以其中+1中的1为数组的类型字节数。
以上实验均在windows平台上运行,Linux平台下结果不同。
- C语言数组指针问题
- C语言数组,指针,函数等问题
- c语言数组指针的问题
- C语言二维数组中的指针问题
- C语言数组与指针的问题
- c语言的数组与指针问题
- C语言 复杂指针的申明问题 数组指针 指针数组 函数指针 指针函数
- c语言 数组 指针
- C语言--指针,数组
- c语言指针数组
- c语言,数组指针
- C语言 指针数组
- c语言指针,数组
- c语言 指针数组
- C语言指针数组
- C语言-指针数组
- c语言指针数组
- C语言指针数组
- iOS 常用的XML解析类库
- 3D扫描技术
- Sublime Text3安装emmet插件
- C++解析xml、json、ini
- 2016,这些爆点式邮件营销策略要马克!
- C语言数组指针问题
- <input>输入框只能输入1-9
- OpenGL函数思考-glHint
- Andriod studio 中启动模拟器出现Cannot launch AVD in emulator
- Android 定时刷新
- 自定义Dialog显示布局,位置
- 欢迎使用CSDN-markdown编辑器
- 如何判断一点在三角形内的四种方法
- iOS 9 学习系列: UIKit Dynamics