C语言指针问题求大神解答

如有下面说明语句: int a[4][5],(*p)[5];p=a;则对a数组元素的正确引用
A p+1
B *(p+3)
C *(p+1)+3
D *(*p+2)
答案是D
其他为什么错了、D为什么对了帮我解释下
还有(*p)为什么加了括号
为什么可以写p=a

a是一个(int类型的)二维数组(二维数组本质上是一个维数组)
p先是一个指针,这外指针指向一个一维数组(int类型的)
p=a表示将指针p的值 斌成二维数组的首地址
A p是一个指针P+1 实际上是首地址 挪5个int位置是地址 返回的是一个地址的值(指向一个int数组的地址)
B (P+3)取得的也是一个地址的值(指向一个int数组的地址)再结合* 得到是一个首地址的值然后再取它的内容做为地址
即 int a[4][5] 中的int a[2][0] 这个位置的地址 再进行退化成 一个一维数组的别名 即 也可看成一个 指向int类型的 地址
C 他是在指向int 类型的地址再向后挪3位 即 是到a[3][3]这个位置 的地址 返回 他还是一个指针

D 返回的是对应二维数组中a[2][0]的这个元素的值

总结一下
A返回的是a[1][0]这个位置的地址 并且 告诉编译器 它是一个指向一维int [5]类型数据的指针
B返回的是a[3][0]这个位置的地址 并且 告诉编译器 它是一个指向 int的地指针
C返回的是a[3][3]这个位置的地址 并且 告诉编译器 它是一个指向 int的地指针
D返回的是a[2][0]这个位置的别名 它是一个int类型
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-01-08
  int(*p)[5]代表的是定义p为一个指针变量,它指向包含5个整型元素的一维数组;
p=a 的含义是将p指向二维数组中第零行的首个元素 *p+2 的含义是二维数组中a[2]即第二列的地址,而*(*p+2)则是对a[2][0]的引用。
A:p+1 无意义。
B:是a[3][0]的地址;不是对元素的引用。
C:也是地址,是a[1][3]的地址,如果写成*(*(p+1)+3),则是元素a[1][3]的值。
第2个回答  2014-01-08
二维数组指针需要两次解引用*才能获得二维数组元素值。所以是D。
相似回答