一道C语言试题,求讲解!!!

来源:百度知道 编辑:UC知道 时间:2024/07/06 16:59:58
8.若已知int a[3][4],*p;p=(int *)a;那么对数组a的第2行第2列的正确引用是: 答案:B
A.a[2][2] B.p[5] C.a[5] D.p[1][1]

p=(int *)a; 这句话请问是什么意思!
p是指向数组a的首地址么? 那么p[0][1] 这么写为什么不行! 而是p[5] 成了一维数组呢· 有点晕! 请高手细讲~~ 谢谢!

p = (int*)a; 就是让p指向a的首地址。
p[1][1]是不可以的, 因为p的类型是 int* 它不是二维的所以不能用二维数组的语法。

关键点就是: 1.要了解内存的状态。 2.要了解语法的限制。
程序思想正确和语法能通过 这两者是必须同时具备的, 但思想和语法未必要一回事, 只要他们各自正确就行了。

p=(int *)a
相当于 p = a,就是把a[3][4]的首地址赋给p.
二维数组在内存中也是顺序存储的:
a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3]......
。a的第2行第2列 为 a[1][1];等于从首地址移动5 p = p + 5 ,也就是p[5]

p=(int *)a是对于二维数组的指针定义方法
p指向数组a的首地址 没错
二维数组是一维数组的扩展
也就是特殊的一维数组
在内存当中存放的方式 二维数组和一维数组是一样的
都是连续的空间存放
p开始指向首地址
然后p[5]也就不难理解了

int *p 类似于 int p[];