本帖最后由 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:还是要加分请假黑马币偶~~~嘿嘿
|
|