已知:int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12},C语言问题

有int(*ptr)[3]=a,*p=a[0]。问怎样表示a[1][2]。a[1][2]应该是6,我的理解应该是*((ptr+1)[2])应该是可以表达的,但是程序运行后... 有int (*ptr)[3]=a,*p=a[0]。问怎样表示a[1][2]。a[1][2]应该是6,我的理解应该是*((ptr+1)[2])应该是可以表达的,但是程序运行后结果是10!然后*(*(a+1)+2),是可以表达的,这是为什么?明明取了地址a+1的值再加2怎么还能再当成指针取其地址的值?求解释! 展开
 我来答
百度网友c0588c1
推荐于2018-05-07 · TA获得超过522个赞
知道小有建树答主
回答量:138
采纳率:0%
帮助的人:64.5万
展开全部

int (*ptr)[3]=a这句,将a的首地址赋值给了ptr,ptr表示的是指向一个含有三个Int的数组的指针,

*((ptr+1)[2])等价于*((ptr+1)+2),等价于*(ptr+3),这表示从数组a的首地址向后移动3个单位,每个单位为一个含有3个Int的数组,所以一共向后移动了9个单位,即得出运行结果10!


要想正确表达a[1][2],应该是(*(ptr+1))[2],数组的运算符[ ]比间值运算符*的优先级高,(*(ptr+1))[2]表示a向后移动一个单位即三个Int,此时ptr指向4,再往后移动2个Int指向6。


其实遇到这类问题画内存结构图比较容易理解了


糖二灰
2013-06-22 · TA获得超过3940个赞
知道小有建树答主
回答量:1052
采纳率:75%
帮助的人:1054万
展开全部
*((ptr+1)[2])和*(*((ptr+1)+2))是等价的,而第二个算式可以演化成*(*(ptr+1+2)),也就是*(*(ptr+3))。
你既然会用指针表示数组,那么我用一维数组给你举个例子:
int arr[3];
这里如果要表示数组的第二个元素,有2种方式 arr[1], *(arr+1),
就是说arr[1] == *(arr+1)
那么你*((ptr+1)[2])我们只看括号内的内容(ptr+1)[2] ,它按照上边的等式转化一下就是*((ptr+1)+2),去掉里面的括号*(ptr+1+2),也就是*(ptr+3);
*((ptr+1)[2]) == *(*(ptr+3)) == a[3][0]
很好的解释了为什么你写的第一个表达式是10了,
你如果要用ptr表示a[1][2]就应该是*(*(ptr+1)+2)或者*(ptr+1)[2]这样写才对。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sleeplioncj
2013-06-22 · TA获得超过288个赞
知道小有建树答主
回答量:177
采纳率:0%
帮助的人:107万
展开全部
(*ptr)[3]=a,数组指针只有3行,数组a有四行,所以(*ptr)[0]={1,2,3,4},(*ptr)[1]={5,6,7,8},(*ptr)[2]={9,10,11,12},所以*((ptr+1)[2])表示的是(*ptr)[2]里面的第二个元素就是10
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lch743
2013-06-22 · TA获得超过1181个赞
知道小有建树答主
回答量:377
采纳率:50%
帮助的人:368万
展开全部
*((ptr+1)[2])这种用法是不对的,数组的下标相当与解引用,比如a[2]=*(a+2)
因此,上面的替换做法是(*(ptr+1))[2].
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式