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

两大问题我已经在题目上面说的很明白了。
问题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的问题解开!!!)。

这都是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的值。
这个例子可以让你更深刻的理解表达式的运算和表达式的值

温馨提示:内容为网友见解,仅供参考
无其他回答

C语言指针运算问题(问题一)*p++和(*p)++(问题二)a[i][j]=*(a[i]+j...
第二个问题更简单了。a[i][j] 是二维数组,相当于a是一个指向指针的指针,或者说a[i]是一个数组,这个数组的每个元素又是一个一维数组。a[i] 就是指向二维数组的第i行这个一维数组首地址的指针,所以 a[i]+j 就是指向第i行第j个元素的指针。

c语言指针*(*(a+i)+j)什么意思,*(a+i)为什么是地址啊,a不应该已经是地 ...
(a+i)看出a[i]这是一维地址,a是二维地址。对于a+1不好判断,以数组解释不通,以指针又解释德通,我就不评价了。

C语言 指针一节,p++,*p++,*++p,(*p)++是什么意思??请举例说明一下好吗...
假设p是指针(也叫地址),指向 a的第二个元素(即a[2]的地址),也就是说p=0x104 你说的4个在c语言里都叫表达式,表达式就有表达式的值:p++:先取值,再++,所以p++的值是0x104,执行完之后p=0x108 p++,根据c的运算符优先级,*p++=*(p++)。是对(p++)这个地址取值。所以*p++的值...

关于C语言指针变量*p++ 、*(p++)、(*p)++的区别
c语言的指针,里面存放的是 物理地址。而*p 是 取内容的意思,即 取当前存放内容对应(指向)的地址 里面的内容。而p++ 就是把 p里面的内容+1个单位,因为 p存的是地址,所以是 地址+1,也就是下一个地址。那么指针p 就指向了 下一个地址了。

c语言中*p++和(*p)++有什么区别?
我看书中解释:*p++:是先取出*p的值,再使p加1 \/\/p是个指针,给p加1,相当于让p指向了x所在地址的下一个位置,而对于x则是没有任何影响 (*p)++:是使*p的值加1.\/\/*p则是p指向的位置对应的值,题目中是*q,所以此时的*q就是x的值,为3,当输出*q之后,再给*q即x自加1,所以x就...

...@a[i][j]的地址为什么可以表示成*(a+i)+j难道*(a+i)还表示一个地址...
a是一个二维数组,a[i]表示其中的一行,是个一维数组,a[i][j]表示一行里面的一个元素。(a+i)就是a[i],是一个一维数组,当然表示一个地址,表示这个一维数组里面的第一个元素a[i][0]的地址。

C语言中 *(p++) p++ *p++ ++*p (*p)++ 分别是什么意思
是*p与++结合,变量是 *p 得出结论:(*p)++ \/\/是指针所指地址中的数据值在增加 (不同点)小结:因为(tip1、tip2)可得出:1.指针所指地址自增 p++等同于*(p++)++p等同于*(++p)2.指针所指地址中数据自增 ++(*p)等同于++*p (*p)++ (左自增:先求变量变化,再输出)形式:+...

c语言中*p++和(*p)++有什么区别?
p++是指下一个地址。(*p)++是指将*p所指的数据的值加一。C编译器认为*和++是同优先级操作符,且都是从右至左结合的,所以*p++中的++只作用在p上,和*(p++)意思一样;在(*p)++中,由于()的优先级比*和++都高,所以++作用在()内的表达式*p上。比如有:intx,y,a[]={1,2,3,4,5},...

c语言程序指针问题
scanf(“%d”,a++);}分析:C语言中约定,指针变量是一个变量,地址为其值;数组名是一个常量指针,在 系统为数组分配存储单元时确定,其值是该数组首元素的地址。因此.数组名不能自增自减 ,也不能在赋值语句中作左值.例程中企图通过对a的改变使指针下移,指向欲输入数据的...

c语言中*p++ 、*(++p) 、(*p)++的作用分别是什么
p++ 先取到指针p指向的值,即*p,然后再给指针p加1,即让p指向下一个位置 (++p) 先给指针p加1,即让p指向下一个位置,然后取出p此时所指位置的值 (*p)++先取出p当前所指的值,然后给这个值加1,指针所指位置不变

相似回答