为什么要写这个?因为这个东西有点混乱,至少我第一次接触的时候是这样的。或许以后还会,所以记下来需要的人一起看吧。
直接上主题,我做事就是很直接,当然也会很啰嗦,下面你将会一并体验到。
int count[2][3] = {{1,2,3},{4,5,6}};
count //数组count[0][0]的地址。
count+1//数组count[0][0]行数的偏移量为1的地址,即count[1][0]的地址。
*(count+1)//等效于count+1。
*(count+1)+1//count[0][0]行数偏移量为1,列数偏移量为1的地址,即count[1][1]的地址。
**(count+1)//count[1][0]的值。注意这里是2个“*”。
*(*(count+1)+1)//count[1][1]的值,这里也可以写成**(count+1)+1,结果都是一样的,反正就是要2个“*”。说到这里有的人可能就觉得奇怪了,上面不是说了“*(count+1)//等效于count+1”那*(*(count+1)+1)能不能写成*((count+1)+1)呢?答案是很肯定的:不能。为什么呢?我的理解是:如果单纯地表示行地址的时候有无“*”都无所谓,反正是一行的地址,同时也是一行的第一列元素的地址。*(*(count+1)+1)含义是先取得第1行的地址,然后再在第1行内偏移1列后,取得地址所存储的值4。如果写成*((count+1)+1)则含义变成:行数偏移1后再偏移1后的地址。
这里有点饶头,多看几次就会明白了。当然按照我的理解来看也是有一定风险的,因为我可能理解错了。不过这些结果我都试验过的,绝对不会错的。
*(count+1)[1]//count[1][1]的值。首先用*(count+1)取得行地址,然后用[1]直接获取这个地址中第1号元素的值。这个表达式等效于*(count[1]+1),同时也等效于*(*(count+1)+1)。~~扑通~~已经有人彻底晕倒了。这里的“*(count+1)”,“count[1]”都是为了有效地进行行地址定位,因为只有先找到行地址才能进列定位嘛!
最后总结:
1. 如果你是想获得多维数组中一行的地址则使用不使用“*”都无所谓。前提是没有“[]”出现。
2. 如果你是想获得多维数组中元素的地址则首先得确定好此元素的行地址(使用“*”,比如*(count+1)这样就确定了是第1行的地址),然后再进行列偏移。
3. 如果你是想获得多维数组中元素的值,则可以在地址之前加“*”一般整个表达式是2个“*”,因为确定某一行的时候的那个“*”是必不可少的。当然也可以使用带有“[]”的方式,这个方式里面需一个“*”和一个“[]”就可以获得数组的值。如果你说使用count[1][1]这样的方式不是更好么?你说的一点都没错,不过我这里主要讨论的是与地址相关的内容。不过要顺带说一下如果使用双“[]”的情况下表达式前加不加“*”都是无所谓的。
再一次总结:
1. 多维数组的地址中,重点就是进行行地址定位,有2种方式,第一种:加“*”eg:*(count+1)。第二种:使用“[]”eg:count[1]。
这里有一个问题啊,* count[1]是地址还是值啊?如果你的回答是地址那请再回头看一下最后总结第一条。这里的* count[1]表示的是一个值,因为这条语句的含义是取count[1]的值,可是count[1]只是一个地址,只进行了行定位,偏要它交出一个值出来,只好把列排名第一的第0个元素丢了出来,即count[1][0]。
学生朋友应付考试的总结:
1. 单个“*”或单个“[]”可以获得地址;双“*”或双“[]”或一个“*”加上一个“[]”可以获得数组值。这样的规律是不是很简洁明了?
错误不足之处还请大家多多指正!谢谢!