C语言指针易错问题【附图+高分】 30

①第一个printf中输出的结果应该是4啊,因为*(p++)代表的就是a[1]啊,a[1]=4②第二个printf中**k错了吧,为什么有两个星花?为什么第一个print... ①第一个printf中 输出的结果应该是4啊,因为*(p++)代表的就是a[1]啊,a[1]=4
②第二个printf中 **k错了吧,为什么有两个星花?为什么第一个printf中只有一个星花
展开
 我来答
jfluo0101
2014-03-01 · TA获得超过1415个赞
知道小有建树答主
回答量:225
采纳率:0%
帮助的人:271万
展开全部

搞IT的人,都是夜猫子啊。。


1.这个题和你前面的提问,都是关于指针的问题,因为指针太灵活,你可以画个跳转图来标记每个指针指向的内容,这样就好理解了。


2.任何变量都需要有存储空间,每个存储空间对应一个存储地址,比如指针p,即p有一个存储地址,该存储地址对应的存储空间放的是p指向的地址;


3.*p表示p是个指针,即p的值是个地址,该地址指向一个字符串(姑且这样说),**k表示k是个指向指针的指针,即k的值也是一个地址,但是该地址指向的还是一个地址;


4.p=a,表示将a的存储地址赋给了p,此时p的存储空间放的是数组a的首地址;k=&p,表示将指针p的存储地址赋给了k;


5.*(p++)的意思是,先用p,后执行p自加操作,所以第一个printf输出的实质上是*p的值,不言而喻,输出的结果是2;


6.第二个printf:前面说过,k存放的是指针p的存储地址,那么*k就是p的存储空间内容(p的存储空间存放的是数组a的地址,但是注意,此时p的值已经加1了,也就是p指向了数组a的第二个元素),因此*(*k)就是数组a的第二个元素,结果就是输出4;


wkp6565
2014-02-28 · TA获得超过200个赞
知道小有建树答主
回答量:265
采纳率:0%
帮助的人:125万
展开全部
1.P++的意思是 先用后加 所以printf("%D\n",*(p++)) 显示*p的值 。但在显示之后 p已自加1
2.int **k 是定义一个类型为int*的*k指针; k=&p即k等于p的地址,所以*k等于p的值 , 而p的值是a的地址。所以*k的值等于a的地址,那么**k(可以看成 *(*k))就a的地址的值 即2,但之前有P++操作 所以是4
追问
你的回答短小精悍,我想问的是您说 p的值是a的地址,是由p=a得到的吧。难么p=a中,p应该是地址呀,怎么说是p的值?所以说p=a的意思是p的地址等于a的地址呀?我错在哪里了?
追答

我们来一句一句分析:

int a[5]={2,4,6,8,10},*p,**k; //a是此数组的地址值,p是int*类型的指针,*k是int*类型的指针,k是int**类型的指针;指针存的是什么?存的是地址!
p=a;   //单从这句来看,表面意思是:把a的值赋给p。而a的值是一个地址,所以p的值是数组的地址值。
k=&p;  //既然k是指针,那么它肯定存的是地址值,&p是取p的地址值。注意这里有两个概念:1. p的值。 2.p的地址值。通过p=a,p的值是a的地址值;而p的地址值通过&p获得,并赋给了k这个指针。既然指针k指向p的地址,那么*k就是取该地址上的值,即p的值。之前我们说过*k也是一个指针,那它肯定也是一个地址值,而p的值就是a的地址值,所以赋值成立。那么**k也就呼之欲出了,看成*(*k),就是取*k这个地址上的值,即地址值为a的地址上的值;即此数组,而之前已有p++,所以取第二个。    p.s.:一定要区分  地址值 和 地址上的值  
pringf("%d\n",*(p++));
pringf("%d\n",**k);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友a28eddc
2014-03-01
知道答主
回答量:11
采纳率:0%
帮助的人:9883
展开全部
其实主要是一个运算符的优先级和结合性的问题。

*与++优先级一样,其结合性自右向左。当*和++出现在操作数p的两边时,从右开始,++先与p作用,
具体步骤:
1.作p++运算:将p拷贝一个副本(假设称为a),然后将p值加1
2.对p的副本作*运算:取a所指向地址的值,即a[0];
第二个中有两个**那表明是指针的指针**k相当于是*(*看)括号中的部分是p的值即a的地址值,a的地址值再加一个*则就是a的值了
呵呵,要是不对,别见怪啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Evdem
2014-02-28 · 超过13用户采纳过TA的回答
知道答主
回答量:48
采纳率:0%
帮助的人:10.5万
展开全部
第一个printf中*(p++)是先对p解除引用再运算p++ 所以结果是2
如果是*(++p)结果就是4

第二个printf中k是指向指针p的指针 所以要想得到k地址的内容必须使用两次解除引用
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式