C语言二维数组名的问题

已定义intw[3][5],那*(*(w+1))为什么不是w[1][0]而是w[0][1]呢,w不是指向w[0]吗,那w+1不指向w[1]了吗还有*(w+1)[4]这个哪... 已定义int w[3][5],那*(*(w+1))为什么不是w[1][0]而是w[0][1]呢,w不是指向w[0]吗,那w+1不指向w[1]了吗
还有*(w+1)[4]这个哪里不合法了,在*和[]同时用来表示一个元素时应该怎么用法(比如(*w+1)[4]表示w[1][4]怎么来的)。
求大神来解答啊
展开
 我来答
CodeBlove
推荐于2016-06-29 · TA获得超过3364个赞
知道小有建树答主
回答量:936
采纳率:79%
帮助的人:243万
展开全部
二维数组名是指定长度的一维数组的指针(常量指针),而一维数组本身是个指针,所以一般叫指针的指针,但其实有差异的。

w的类型是 int (*)[5]
*(*(w+1))等价于w[1][0],谁和你说不是?你如果怀疑自己做个测试不就完了。

w+1等价于&w[1]或w[1],类型 int (*)[5] 和w一样
*(w+1)等价于&w[1][0] ,类型 int * ,注意 w+1和 *(w+1)地址是一样的但是类型不同
*(*(w+1))等价于w[1][0]

*(w+1)就是在第二行地址,类型是int *,它是个整体,使用它当做一维数组读取必须加括号
正确的写法是:(*(w+1))[4]
如果不加括号意义就不同了,*(w+1)[4] 那就成了第二行第5个元素作为指针,但是实际上该元素是个整数,会造成非法地址访问。
更多追问追答
追问
大致我懂了,w+1等价于&w[1]我知道,但等价于w[1]有点不理解,w[1]应该是int *型吧,还是说w[1]和w+1只是地址相同但类型不同,还有下面的问题是(*w+1)[4]为什么是w[1][4]
追答
这么理解吧,w是一系列(一维数组地址)的集合的首地址,
w[1]是一个具体的一维数组首地址(指针,其类型是int (*)[5]),不是一维数组本身,就好比int *p=a,p是个一维数组的指针一样,你要取值必须用星号,因此*(w+1)才是用来取一维数组第一个元素地址的,相当于数组名写法就是 &w[1][0]。注意地址类型,别只看地址相同就认为是同一个概念。

就好比w的地址是数组的地址,W[0]的地址是第一行的首地址,他们都是相同的,但是w代表整个数组,W[0]只代表第一行。
和蔼的爽哥
2014-09-19
知道答主
回答量:2
采纳率:0%
帮助的人:2622
展开全部
*(*(w+1))应该是w[1][0],至于后面的写法没必要纠结,写成自己能理解的就行。比如*(w[1]+4)或是*(*(w+1)+4)表示w[1][4]不就行了嘛
追问
不,我是在做道选择题遇到这种写法的,有谁会自己写这种脑残的写法,那道选择题的答案里说*(*(w+1))是w[0][1]那是答案错咯,还有后面的*和[]用法你也没回答我啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式