C语言中,指针是一个复杂但又灵活多变的知识点,我们知道,在一维数组中,对于一个数组a[],*a,a,&a,都表示a的首地址,但如果与二维数组混合使用,就显得更为复杂了。例如对于一个二维数组
a[2][4]={{1,2.3},{4,5,6}}
a+i,&a[i],*(a+i),a[i],
这四个表达式到底表示什么呢?
-----------------------------------------------------------------------------------------------------------------------------
先告诉答案吧,其实这几个表达式都是指向同一个地址的,也许你会很诧异,也会很疑惑,怎么会是这样呢!!事实证明就是这样的,
下面来一一道来。在二维数组中,
指针指向分为两个方向:行指向和列指向,尽管上面给出的都是指向同一个地址,但是表达式之间表示的含义还是有轻微的区别的:
其中 a+i 和 &a[i]表示指向行的地址,也就是说,这两个表达式指向的地址是针对一行而言的,指向第i行的首地址,并没有精确到某列元素的地址;而*(a+i),a[i]表示指向列的地址,具体的表示就已经精确到第i行0列这个元素的地址了,这个地址正好是第i行的首地址,所以出现了这几个表达式都指向同一地址。同样我们知道二维数组中 *(a+i)+j 表示数组元素中第i行j列的元素地址,即等价于&a[i][j],【同样*(*(a+i)+j)表示的值就是a[i][j]的内容了】。所以很容易的得到 *(a+i)<=>*(a+i)+0 即表示指向第i行0列的元素的地址,而"a[i]"整体就可以看作一个一维数组,那么这个一维数组表示的就是首地址了,综合起来就是第i行0列的元素的地址。