A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 guyinghua901018 于 2015-4-22 23:37 编辑



最近在学习指针,弄得我是晕头转向.于是下定决心搞定常量,一级指针,二级指针之间的关系.在研究的同时发现其实二维数组跟二级指针有很多的相似之处.于是画下此图.与诸位分享......

首先,在我理解二维数组和二级指针各个层级之间关系的时候,难免会遇到这样的几个负号:   1)   **.....   
2)  *.....   
3)  &.....  
4)  a[0]  
5)  a[0][0]  
这些之间的关系真的是让人焦头烂额.
下面我就根据上面的图,分析一下各个之间关系的规律.大家可以发现,上下两个一个是二维数组,一个是二级指针,两者其实是上下对称的关系.所以下面我就只说一下二级指针.

写在前面:
       在我看来,二维数组其实是很特殊的二级指针.他的指向方式,地址的存储方式的本质跟二级指针其实是一模一样的.之所以说他特殊,是因为每个元素都可以用   **二维数组变量名    ,    *变量名[一维下标],     变量名[一维下标][二维下标]来表示.所以大家可能认为其实a就是a[0]  或者  a就是&a[0].  如果是这样的认识,那么我只能说这种认识仅限于二维数组.如果你看了我下面的解释,你会发现其实二维数组只是二级指针的一种特殊情况.

(以下用到的变量全部都是上图中的变量,就不在重复说明了.)
1)   在多级换算的时候的规律
这么多的关系,很难背下来.要想要理解我推荐用代入的方法来理解.我们只要记住,指针是用来存储地址的就可以了.那么就可以总结为   指针变量名 == &所指向的的变量,例如p = &a;  然后指针上面加一个  *   他所指向的变量就减去一个&.例如 p == &a,左边加一个* 右边就去掉一个 & 就是*p == a;  那么我们来举一个例子.**pp怎么换算呢. 首先 pp == &p 那么**pp == **(&p); *(&p) == p; 那么**pp == **(&p) == *p ;然后p == &a,所以**pp == **(&p) == *p == *(&a),因为*(&a) == a;那么**pp == **(&p) == *p == *(&a) == a ,也就是**pp == a.最后得出正确答案.  下次再有这样的题只要一代入,轻松解决.


2)   运算符也是有一层一层的关系的
这里面无非两个运算符一个 *   一个  &.大家可以发现一个指针p中,   &p   ------->    *(&p)      ==     p      ----------->   &a  ------------>  *(&a) ==   a .  这只是一种理解方式,便于理解他们的指向关系.不过一个规律就是    &  ------>    *(&p)   ==    变量名所代表的内容 .那么我们可以说   &   距离它的上一级最近,    变量名距离它的下一级最近.  这里写的这一条是为下面一条做铺垫的.

3)   添加的运算符越少,越靠近它的下一级.
pp是一个二级指针,如果一个*运算符都不加,根据上面的远近关系,那么pp就代表它的下一级p的地址 也就是&p.  一级指针p,如果一个*运算符都不加,那么就是他所指向的变量a的地址也就是&a.  反之亦然.加的*越多,那么距离自己这一级就越远  *pp 代表的就是 *(&p) 也就是 p.*p代表的就是*(&a)代表的就是a.  所以在图里面开头越往左,指向的目标就越往右,这也是可视化的.





最后来说一说我对二维数组和二级指针之间本质的理解.
二维数组之所以说是特殊的二级指针,是因为他们之间的各个级别的换算关系是一模一样的.从上图可以看出来,换算关系根本没有任何的区别.但是,肯定有人会问,按你的换算方式a应该等于&a[0]啊,那么为什么a也等于a[0]呢,加不加这个&都没有什么却别.  
那么我的答案是肯定的,这个问题在取地址的时候是没有任何区别的,得出的结果完全一样. 但是我又说他们的本质是不同的,依据就是 *a 与 *a[0]的结果是不一样的.*a = a[0] , *a[0] = 第一行第一个元素的值.  这一点就可以看出,虽然这两个代表的地址是一样的,取地址所代表的内容的时候却代表着完全不同的东西.  这深刻地告诉我们一个道理,表象一致并不一定本质一致.  想要首地址可以有好多种方式,但是他们又分别代表着不同的含义. 这含义其实就是他们内部存在的层级关系.

好了就说到这里.好好学习天天向上......iOS基础班,0406班奉上.
ps:还是要加分请假黑马币偶~~~嘿嘿

10 个回复

倒序浏览
懵了!?
回复 使用道具 举报
不用那么复杂,我已经用一句话把我们宿舍的都搞定了.
回复 使用道具 举报
大白菜cabbage 发表于 2015-4-22 23:45
不用那么复杂,我已经用一句话把我们宿舍的都搞定了.

大神就是大神  
回复 使用道具 举报
大白菜cabbage 发表于 2015-4-22 23:45
不用那么复杂,我已经用一句话把我们宿舍的都搞定了.

来分享一下
回复 使用道具 举报
mark                     
回复 使用道具 举报
bieny 中级黑马 2015-4-22 23:49:54
7#
好长呀...
回复 使用道具 举报

看红字就行......不是,你不是应该绕道的嘛
回复 使用道具 举报
bieny 中级黑马 2015-4-23 00:11:38
9#
guyinghua901018 发表于 2015-4-22 23:50
看红字就行......不是,你不是应该绕道的嘛

没你理解的透彻,我现在是有的东西自己明白,但是给别人讲不明白
回复 使用道具 举报

"睡一觉,明天起来全忘了就行了".
回复 使用道具 举报
解释好长阿,阅读恐惧症人伤不起
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马