C语言中关于指针问题

若有定义intw[3][5];,则以下不能正确表示该数组元素的表达式是A:*(*w+3)B:*(*w+1)[4]C:*(*(*w+1))D:*(&w[0][0]+1)关键... 若有定义int w[3][5];,则以下不能正确表示该数组元素的表达式是
A: *(*w+3) B:*(*w+1)[4]
C:*(*(*w+1)) D:*(&w[0][0]+1)
关键是不懂B选项 表示的是什么?
展开
 我来答
无中生有何时明
2010-05-21 · TA获得超过510个赞
知道小有建树答主
回答量:145
采纳率:100%
帮助的人:97.7万
展开全部
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你应该理解了。

还不理解就补充问题吧。。
wqyun84
2010-05-21 · TA获得超过317个赞
知道小有建树答主
回答量:108
采纳率:0%
帮助的人:200万
展开全部
我刚刚在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肯定就会出错了.
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友4785a87
2010-05-21 · TA获得超过1209个赞
知道小有建树答主
回答量:293
采纳率:0%
帮助的人:302万
展开全部
C错,首先int w[3][5];这是一个3行5列的二维数组,所以w当以二级指针对待,而此C是三维指针,故C是错的。

对B,我的理解是,它表示指针w指向一个由4个一维数组组成的二维数组,
(*w+1)[4]表示指向第二个一维数组(即第1行)的第一个元素(即0元素),
所以,*(*w+1)[4]表示w[1][0]元素。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式