c语言的二维数组地址问题

Python07

c语言的二维数组地址问题,第1张

答:

二维数组

2113a[3][4]中,a[1]+1是数组5261a[1]的第2个元素地址,a[0]+4是数组a[0]的第5个元素的地址,但a[0]只有4个元素,所以a[0]+4就是a[1]首元素的地址,因此4102这是两个不同的地址。

另外,也可以1653将二维数组a[3][4]看成一维专数组a[12],那么原来的a[1]+1就是

一维数组

的a[5]的地址,而原来的a[0]+4是一维数组的a[4]的地址,由此可见属,这是两个不同的地址。

1、&a[0][0]为0行0列元素的首地址,a[0]+n为0行第n个元素地址,那么a[0]是表示0行首元素地址吗?

>>正确, a[0]就是0行首地址.

&a[0]是零行的首地址,实际上行的地址也只有一个,也无所谓0行的首地址吧?

>>&a[0]值上, 是和a[0]相同的, 不过类型不一样. a[0]等效于int *型,实际上是指向一个元素. 而&a[0]是行指针, 指向一行.所以,a[0]+n和&a[0]+n是完全不同的. 

+n相当于元素位移了n个位置吗,所以代表第n个元素地址吗?

>>+n取决于原始指针的类型. 如果是a[0]+n 移动的是n个元素.而&a[0]+n就是移动n行了.

然后*(a[n]+m)就表示n行第m个元素了?

>>这句没错. 任何情况下, *(p+n)都等效于p[n]

2、书中写a+n表示第n行的首地址,那是相当于&a[n]吗,a不是表示数组首个元素地址吗,怎么+n不是元素位置改变,却是位移了行?

>>这个上面说过了, 核心在于指针的类型. 二维数组int a[M][N]的数组名a, 本质上是常量的int (*)[N]类型, 也就是数组指针. 移动的时候是整行移动的. 

还是a+n表示n行首个元素的地址?为什么

>>同上

*(a+n)与a[n]是等价的,原理是什么,*(*(a+n)+m)怎么也能表示n行m列元素呢?

>>*(a+n)与a[n]等价, 这个是C语言的一个规则. 其本质是, 当编译器遇到a[n]这样的形式时, 实际上是翻译成*(a+n)进行编译的. 这种可以用一个很少见的形式来验证.你定义

int a[4]={1,2,3,4}然后输出

printf("%d\n", 3[a])

对, 就是把数组名放进[], 实际上会输出a[3]