| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 757 人关注过本帖
标题:指针的一个问题,请教
只看楼主 加入收藏
ajax_liu
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-6-16
收藏
 问题点数:0 回复次数:12 
指针的一个问题,请教

程序是下面这样子的
#include<stdio.h>
main()
{
int a[]={1,2,3,4,5};
int *p;
p=a;
printf("%d%d%d%d\n",*p,*(++p),*++p,*(p--));
printf("%d%d\n",*p,*(a+2));
getch();
}

运行结果是:
2211
23

我不太明白在第一次输出的*p为什么是2啊?
因为当数组a赋值给p的时候是&a[0]的哦,而且数组a中的0号元素不就是1么????郁闷

搜索更多相关主题的帖子: 指针 
2007-06-16 00:35
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 
因为默认情况下,printf()函数读区参数,就是入栈的顺序是从右至左,就是先算*(p--),将值入栈,然后依次*++p,*(++p),*p.

为防止此类错误,规范编程,不要在函数参数中写可以改变变量值的表达式,切记!!
2007-06-16 00:47
gospark
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2007-6-1
收藏
得分:0 
pinrit函数是从右到左输出,比如 print("%d%d%d",p,q,r), 输出为 r q p
不过一下我就不明白了 为什么,*++p,*(++p),都输出那样的结果呢?

软硬结合才是发展之路~~~
2007-06-16 00:52
ajax_liu
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-6-16
收藏
得分:0 

请问2楼的大侠,如果printf是从右至左的顺序的话,也就是先算*(p--),那为什么结果等于2????
*(p--)是先赋值再自减1那应该是0了啊 !???
不懂


2007-06-16 10:02
我是菜鸟哦
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:921
专家分:209
注 册:2007-5-4
收藏
得分:0 
大哥是一一对应,虽然是从右到左运算但是对应关系没有变啊.
况且那个*(p--)看好"--"是作用在P上的也就是地址--

[此贴子已经被作者于2007-6-16 10:12:23编辑过]


偶是菜鸟鸟偶惧WHO?!!!!
2007-06-16 10:10
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 
printf()叫做格式化输出,输出是自然按照你给的格式了,这是格式控制字符串"%d%d%d%d\n",后面是输出的顺序*p,*(++p),*++p,*(p--)

我说从右至左的入栈顺序,但是没有说是从右至左的输出啊,入栈只是函数读参数的过程,最后输出还是会按照从左到右的顺序输出的.
你如果学了堆栈就明白FILO(先进后出first in last out)结构了,就像你把一些盘子A,B,C,D堆到一起,如果从右至左的的拿盘子顺序,你先拿D,然后把C放到D上面,最后依次是B,A,这样A就在最上面,D在最底下,这就是堆栈.如果你要让它们从栈里头出来,你要先拿出A,然后是B,最后依次是C,D.所以右至左的入栈顺序对应从左到右的出栈顺序.这样说你明白了吧.
2007-06-16 10:43
ajax_liu
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-6-16
收藏
得分:0 

非常感谢楼上大侠的指教,虽然我没学过堆栈,但是听你这么一分析这个顺序,我就明白了。
但是最不懂的还是为什么结果是
2211
23
*p的值为什么是2??
把数组a赋值给p之后应该是从数组的第0号元素开始,
而从题目知道数组a的0号元素是1(int a[]={1,2,3,4,5};)
所以为什么*p的输出是2?????


2007-06-16 18:54
aaaasix
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2007-6-10
收藏
得分:0 

烦,看了半天也没有一个人说个准确的答案!
太期望了!
好想知道!

2007-06-16 21:45
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 
一点悟性都没有.不是没有说准确,你自己看不懂.下面是傻瓜式分析:

int a[]={1,2,3,4,5};
int *p;
p=a;
printf("%d%d%d%d\n",*p,*(++p),*++p,*(p--));
printf("%d%d\n",*p,*(a+2));

第一个 printf()先将*p即 a[0]入栈,然后p--;下一步++p,将*p即 a[0]入栈;再下一步++p,将*p既 a[1]入栈;最后将*p既 a[1]入栈.输出顺序和入栈顺序相反,依次输出a[1],a[1],a[0],a[0].
现在p指向的是&a[1],所以第二个 printf()输出的是a[1],a[2]
2007-06-16 22:00
ajax_liu
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-6-16
收藏
得分:0 

非常感谢百年的指教,我学C半个学期了,但是还没有学堆栈,所以在理解上还是有点困难,
我想我还是回去再问下老师吧,非常感谢百年的耐心教导!!


2007-06-17 01:24
快速回复:指针的一个问题,请教
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030811 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved