关于二维数组和指向指针的指针
来源:互联网 发布:微信商城分销源码下载 编辑:程序博客网 时间:2024/06/11 12:36
以前一直有种误解:
二维数组的是数组的数组,所以数组的首地址是指向第一个元素指针,而这个元素又是一个数组,所以把数组首地址理解为指向指针的指针。
如int a[3][2];,以前一直认为a是一个指向int指针的指针,即是一个int**。最近发现这是错的。
如果int **p=a; 编译就会报错。如果强制转换int **p=(int **)a,则使用p[i][j]访问数组元素时出错。
首先,因为a的定义为 int a[3][2];则a的类型是int* [3][2]数组类型,或者int* [][2],即指向大小为2的数组的指针,类型与int **不同,所以int **p=a;出错。
其次,考虑p[i][j]访问a的数组元素时出错的问题。当我们使用指向二维数组的指针的下标运算来访问数组元素时,如a[i][j],它等同于*(a+i*2+j);即必须要知道第二维的大小才能访问。考虑我使用p[i][j]的后果:p是int**,所以p[i]为*(p+i),而这个结果被视作一个指针,在这里记做pp=*(p+i),所以p[i][j]等同于pp[j]。最终的结果为*(pp+j),并将这个结果解释为一个int值。
例如:
上面最后一部分pA[i][j]出错的原因如下:
如上所述:p[i]是*(p+i),即在p处移动i个类型单位大小(p的类型是int**,通常指针都是32位值吧……多数情况正好和int大小相同),所以正好移动i个int大小,假设i=0,j=1,则p[i]是0;那么p[i][j]就是0[1],相当于将地址4的值取出来解释为为int ,地址4当然不允许用户程序访问,所以运行时错误……
- 关于二维数组和指向指针的指针
- 二维数组和指向指针的指针
- 二维数组和指向指针的指针
- 二维数组和指向指针的指针
- 二维数组和指向指针的指针
- 二维数组和指向指针的指针
- 二维数组和指向指针的指针
- 二维数组和指向指针的指针
- 二维数组和指向指针的指针
- 二维数组和指向指针的指针
- 二维数组和指向指针的指针
- 二维数组和指向指针的指针
- 二维数组和指向指针的指针
- 二维数组和指向指针的指针
- 二维数组和指向指针的指针
- 二维数组和指向指针的指针
- 二维数组和指向指针的指针
- 二维数组和指向指针的指针
- COM原理与应用中关于聚合实现的纪要
- 通过URL从Temporary Internet Files得到本地文件路径的函数
- 重载实例源代码
- 前三天的试用期啊
- VB6中使用32位图标(第二版)
- 关于二维数组和指向指针的指针
- VB6中使用32位图标
- 成功修复2G金士顿U盘
- ActiveXDLL免注册调用的方法(改良自阿国哥的源码)
- 支持多曲线的历史曲线控件源码
- CLSID与ProgID彼此间相互转换
- 拨号、断网、枚举连接名称,判断是否在线、连接方式
- 实用的内存块操作类(vb源码)
- 判断URL是否在IE缓存中,并仅删除该URL