c语言数组与指针相关问题,谢谢

程序如下inta[3][2]={1,3,4,7,8,2};int(*p)[2]=a;printf("%x\n",p[1]);//对应a[0]的地址,printf("%x\... 程序如下
int a[3][2] = { 1, 3, 4, 7, 8, 2 };
int (*p)[2] = a;
printf("%x\n", p[1]);//对应a[0]的地址,
printf("%x\n", p+1);//对应a[0]的地址,
printf("%x\n", *p[1]+1);//对应a[0]的地址,
printf("%x\n", *(p+1)+1);//对应a[0]的地址,

打印结果如图
我不明白的是,前两个一样,说明p[1]和p+1都是表示一个地址。然后下边我都用*号把地址取出来,然后再加1应该都是34f9ac这个地址啊,为什么第三个却是5呢(为什么是把4取了出来再加1了呢)?为什么呢?谢谢
展开
 我来答
千锋教育
2015-12-04 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
展开全部
注意操作符的优先级,第三个*p[1]+1中[]最高,所以是p[1]即为34f9a8,再是*指针取内容操作符,即取出地址34f9a8的内容即为4,再+1所以得到5
追问
但是p+1也是34f9a8,然后我用括号括起来再取值*(p+1)也就相当于把34f9a8的内容取出来啊,为什么不是5呢?
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
一颗程序猿o_0
2015-12-04 · TA获得超过6298个赞
知道大有可为答主
回答量:5403
采纳率:77%
帮助的人:1365万
展开全部
*p[1] 相当于 p[1][0], 值为4, 加上1就是5了
更多追问追答
追问
请根据我的疑问回答,我说了打印p[1]和p+1都是同一个地址,然后我都进行取值运算,然后再加1,为什么结果不一样?谢谢
追答
中括号运算会解掉一层数组, p[1]的类型为 int *(一维指针)
p本身的类型为 int **, 所以p+1所得结果也是int**(二维指针)
*号运算同中括号一样,解掉一层数组(或者维度), 所以第三行最终类型为int, 而第四行的为int *
因此三行为数字5, 而四行为一个地址
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式