C语言指针数组的问题 刚刚有点错误

0<=i<4
int a[4][10],*p,*q[4];
下列错误赋值的是:
A,p=a B,q[i]=a[i] c p=a[i] D q[i]=&a[2][0]
分别解释下呗
答案为A

int a[4][10],*p,*q[4];
a的类型:int [4][10],a是一个有4个元素的一维数组,每个元素又是有10个int型数据的一维数组
本质上 C语言是没有多维数组 的!请楼主记住。
所以a的首元素是a[0],a是首元素a[0]的地址,即a = &a[0]
千万不要认为a是首元素a[0][0]的地址,而写成a = &a[0][0],酿成笑话!
请记住:a的首元素是a[0],以后学习多维数组及指针的时候不会再有困惑!
p的类型:int *
q的类型:int *[4]
再看,a[i]是什么类型?很简单,int [10]!一个一维数组!
q[i]呢?int *是也!

重点来了:为什么q[i] = a[i] ?搞不懂了吧?!
(声明:以下是我个人的独创分析法,原创哦,献丑了!)
其实我们看看一维数组和一维指针的定义你就明明白白了
int A[10];
int *Q;
Q = A; >>> 明白了吗?一位数组可以赋值给一维指针。(仅限一维!)
但多位数组不可以赋值给多位指针,切记啊!
再看我们的问题:q[i] = a[i] ?
因为 (a[i]) 是一维数组(加上括号是因为a[i]作为一个整体,记住:a是所谓的二维数组!);
而 (q[i]) (也是作为一个整体)的类型是int *即指针。所以两者可以赋值!

总结一下:找类型方法,去掉名字就可以了!
对于数组,int a[4][10],a的类型,去掉名字得int [4][10];a[i]的类型,去掉a[i]得int [10]!
对于指针,其实一样的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-02-19
int* p 类型是 int*
int a[4] 类型是int []
p=a//这种情况下是对的
int a[4][10] 类型是 int a[][]
int* q[4]类型是 int (*)[4]
A,p=a 错误是因为获取不了地址
B,q[i]=a[i] D q[i]=&a[2][0]//二维数组的每行的地址可以被数组指针接受
c p=a[i] //p获取的把二维数组分拆为俩个数组,把一个数组元素的地址赋给p
第2个回答  2012-02-19
A,**p,则p=a,
B,q为指针数组,a[i]为二维数组行的指针。对
C,同B
D,q[i]指向a[2][0],类型相同正确。
相似回答