C语言指针运算问题(问题一)*p++和(*p)++(问题二)a[i][j]=*(a[i]+j)=*(*(a+i)+j)

两大问题我已经在题目上面说的很明白了。问题1:式一:*p++式二:(*p)++,先说式一,*和++都是单目运算符,优先级别相同,结合方向自右至左,也就是说先++再*,但是... 两大问题我已经在题目上面说的很明白了。
问题1:式一:*p++式二:(*p)++,先说式一,*和++都是单目运算符,优先级别相同,结合方向自右至左,也就是说先++再*,但是根据++运算的规律:p++(先使用再++)和++p(先++再使用),也就是说先把p使用了(*p先执行),再++,这不是矛盾了吗?(注意:我知道答案是p先++再*),我要解决的问题是这个矛盾,而不是运算的答案。再说个式二,由於()是初等运算符,优先级别最高,毫无疑问先*再++,式二和我推理的矛盾结果是一样的。最後:我要问的问题是:注意!注意!这是问题:为什麽*p++是先++再*(回答的结果必须要把矛盾解开!!!)。
问题2:式子:a[i][j]=*(a[i]+j)=*(*(a+i)+j),根据数组和指针的一些概念不难推理出a[i]=*(a+i),因为a是数组的首地址(其他概念我也不多说了)。但是有一点让我费解,那就是a[i][j]=*(a[i]+j),这是一个二维数组的等式,我们先看等号右边,()是初等运算符,优先级别高於*,毫无疑问先算a[i]+j,[]也是初等运算符优先级高於+,所以[i]先与a结合再+j,可是a[i]算出来的结果是一个数值,因为a[i]=*(a+i),是个数值,而不是个地址。问题二:注意!注意!这是问题:那为什麽数值+j再求*会是a[i][j]这个二维数组呢?(回答的结果必须要把a[i]是个数值再+j的问题解开!!!)。
展开
 我来答
terender
推荐于2016-08-02 · TA获得超过243个赞
知道小有建树答主
回答量:68
采纳率:0%
帮助的人:77.7万
展开全部
这都是C的基本概念了,要理解这个你必须先理解C的表达式的概念。表达式是有自己的值的,而且表达式的值也是有类型的。比如有int型变量i,那么 i=5 这个赋值表达式也是有值的,他的值是5,类型是int。所有的混合表达式,都是用低级表达式的值参与更高级的表达式的运算,所以

*p++ 等同于 *(p++) 先执行p++ 表达式,然后用p++ 表达式的值来参与* 表达式运算。那么p++表达式的值是什么?对了,是自加之前的p的值,这个值的类型是什么?是跟p相同类型的指针,所以对这个值进行取值操作,取出的是p自加之前的指针指向的内容。

第二个问题更简单了。a[i][j] 是二维数组,相当于a是一个指向指针的指针,或者说a[i]是一个数组,这个数组的每个元素又是一个一维数组。a[i] 就是指向二维数组的第i行这个一维数组首地址的指针,所以 a[i]+j 就是指向第i行第j个元素的指针。
追问
第一个问题你的意思我大概清楚了,也就是说表达式的运算和表达式的值是有区别的,p++表达式的值是p,但是他参与了运算就和值不是一个概念了,第二个问题我完全看懂了,也就是说a[i]存的不是个数值还是个指针。谢谢。你是不是觉得我问的问题有点奇葩,或者钻牛角尖。
追答
不算钻牛角尖,第一个问题其实很重要,这是C中比较重要的概念之一,就是表达式的值。
你说的对,表达式的运算和表达式的值不是一回事,表达式的运算是运算的过程,运算的过程结束之后会产生一个值。
复杂的表达式最终可以拆解为简单的表达式的组合,而简单的表达式在运算完之后,取其值再参与上层表达式的运算。

比如p++, 这个表达式的运算是先取出p的值作为整个表达式的值,然后再对变量p进行自加操作。这个表达式运算之后的结果是,变量p所存储的值自加了,但是表达式本身的值,是自加之前的p的值。

表达式的值不一定跟预算过程有必然的逻辑关系,比如逗号表达式
(表达式1, 表达式2)
逗号表达式的求解过程是,先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。
这个例子可以让你更深刻的理解表达式的运算和表达式的值
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式