C语言。下面对数组元素不正确的引用的是?

定义float a[3][4];
A)a[i][j]
B)*(a[i]+j)
C)*(*(a+i)+j)
D)*(a+i*4+j)
把这4个都解释一下??

A:是正确的,比如a[0][0]
B:是正确的,a[i]+j是a[i][j]的地址,在用*指向也是引用了这个地址
C:是正确的,*(a+i)表示a[i][0]的地址*(a+i)+j是a[i][j]的地址*(*(a+i)+j)也是使用了他
D:是错误的,因为他只指向了一次,就是a[i*4+j]的地址。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-11-06
做此题必须对一维数组比较了解
答案D,二维数组其实是一个一维数组,并且每行也能看成一个一维数组,所以,二维数组也可以看出是多个一维数组组成,并有以下对应关系
第0行首地址,a[0] = &a[0][0]
以此类推,
第i行的首地址 a[i] = &a[i][0];
另外规定 *(a+i) = a[i];故可以看成 a 是a[0],a[1],...a[i ]..,各行首地址的所组成的一维数组的首地址
A正确,就是取a[i][j]元素
B正确,*(a[i]+j) 第i行首地址偏移j,取得是a[i][j]

C正确,由于*(a+i) = a[i]=》*(*(a+i)+j) = *(a[i]+ j) = a[i][j]
D,*(a+i*4+j) = *(a[i*4+j]) = a[i*4+j][0],当(i*4+j) > 3时,就会越界,故引用错误追问

答案是D额= =

相似回答