B、C都是错的。
首先int w[3][5];这是一个3行5列的二维数组,所以w当以二级指针对待,而此C是三维指针,故C是错的。
对于*w,它表示的是这个数组的第一行的首地址(是指向这个元素);而*w+1表示的自然就是第一行的首地址向后偏移一个int单元的地址,也就是说这时*w+1仅仅是一个指向一个int类型数据的指针(注意本例中*w是一个指针与w是一个指针的说法的区别,也就是一级指针与二级指针的区别),而非指向一个数组,故此时(*w+1)[4]便相当于某一级指针向后偏移4个单位的值(与一维数组a[4]的意思差不多)。所以答案B中在(*w+1)[4]的基础上再加个*便有语法错了,就跟*a[4]一样。
再所以,答案A是正确的也就不难理解了。
按你题目的意思,答案D你应该理解了。
还不理解就补充问题吧。。
我刚刚在VS2010里试了一下, B和C都是错的.
计算机题目应该都是单选的, 所以有可能是你有一点的笔误, B如果是(*w+1)[4]就正确了.
首先我给你一个最简单的我自己总结的方法吧, 要想从数组或者指针中取数据的话, 要满足这个公式(这是必要不充分条件):
*的个数 + []的个数 - &的个数 = 指针级数(或者数组的维数)
比如A中:2+0-0=2, 因此有可能对. B中2+1-0=3必须不对. C中3+0-0=3必须不对. D中1+2-1=2, 有可能对.
从类型来看, w类型为int[][], *w为int[]类型, *(*w+3)为int类型, 因此A是正确的.
B中, w为int[][]类型, *w为int[]类型, *(*w+1)[4]相当于把int作为地址了, 也就是从非地址数据类型为取数, 错误. C和B的错误实际上是一样的
D就正确了. w[0][0]为int类型, 而&w[0][0]为int*类型, &w[0][0]+1仍然为int*类型, *(&w[0][0]+1)为数据了
再具体看下B:
w为二维数组首地址, 也就是int类型的二级指针, *w实际上就是w[0]也就是第一行的首地址, 其类型为int*, 而*w+1是第二行的首地址, 类型也为int*, (*w+1)[4]表示第二行中第五个元素, 已经把数据取出来了, 类型已经为int了. 如果再进行*操作, 也就是*(*w+1)[4]肯定就会出错了.相当于: 定义一个整形int a;然后执行*a肯定就会出错了.
C错,首先int w[3][5];这是一个3行5列的二维数组,所以w当以二级指针对待,而此C是三维指针,故C是错的。
对B,我的理解是,它表示指针w指向一个由4个一维数组组成的二维数组,
(*w+1)[4]表示指向第二个一维数组(即第1行)的第一个元素(即0元素),
所以,*(*w+1)[4]表示w[1][0]元素。