博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于二维数组和指向指针的指针
阅读量:2437 次
发布时间:2019-05-10

本文共 1181 字,大约阅读时间需要 3 分钟。

以前一直有种误解:

二维数组的是数组的数组,所以数组的首地址是指向第一个元素指针,而这个元素又是一个数组,所以把数组首地址理解为指向指针的指针。

如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当然不允许用户程序访问,所以运行时错误……

转载地址:http://ebemb.baihongyu.com/

你可能感兴趣的文章
UVa 10917 Dijkstra
查看>>
CF403B/CF402D
查看>>
CF402E / 403C
查看>>
cf404b
查看>>
cf404c
查看>>
cf404d
查看>>
武大网络预赛 Problem 1545 - I - Twenty-four
查看>>
ZOJ Problem Set - 3768 Continuous Login
查看>>
某山面试 3、实现如下函数:
查看>>
malloc的小知识
查看>>
UVALive 6755 - Swyper Keyboard
查看>>
uva_11029 Leading and Trailing 快速幂 数的n次方前几位
查看>>
uva10023 手算开方的方法
查看>>
欧拉函数——从容斥定理和积性函数的性质谈开
查看>>
容斥原理 带禁止位的排列
查看>>
第一个JSP程序(JSP入门)
查看>>
JSP语法简介
查看>>
JSP中EL表达式入门与简介
查看>>
Spring入门实例
查看>>
Spring的几种注入方式
查看>>