现在有一种在Windows下运行的一种叫Win-TC的C语言源代码编辑工具以小巧的身躯和强大的功能受到很多网友的青睐。但最近有位朋友给我一个关于指针的源程序。用Win-TC编译和英文版TC2.0编译出来的结果截然不同,请看下面的代码:
#include ”stdio.h”
main(){
int a=100,*pa=&a,*pp=pa;
printf(“a=%d,pa=%d,pp=%d”,a,pa,pp);
getch();
}
在Win-TC中编译运行,结果为:a=100,pa=4040,pp=4295。这个结果让人哭笑不得。
在英文版TC2.0中编译运行,结果为:a=100,pa=-60,pp=-60。这个结果很正常。
但是把 printf(“a=%d,pa=%d,pp=%d”,a,pa,pp); 改成 printf(“a=%d,pa=%d,pp=%d”,a,*pa,*pp); 则两个编译运行结果相等,都是a=100,pa=100,pb=100。到底问题出在哪里,也许只有Win-TC的作者才能解释。所以劝一下那些用WIN-TC的朋友们写好程序后最好再到英文的TC中编译调试一次。
———————————————————— ——————–
网友xingchenyiyi 评:
看到了“用Win-TC编译与用TC2.0编译的差异”这片文章。我就文中作者的用法问题作
一解释!程序:
int a=100,*pa=&a,*pp=pa;
printf(“a=%d,pa=%d,pp=%d”,a,pa,pp);
int a=100很规则,但”&a”代表一个地址,”&”是取地址符号,取得了存储值是100的内
存地址。而”*pa”的用发表示指针地址”pa”中存储的值。”int *pa;”表示指针类型pa中
存储的值是整形。也就是说它可以直接等于常量。此时”*pa=%d”这种用法是把”a”的地
址存储进了”pa”.”*pp=pa”这个用法和前面的一样是把”pa”的地址存储进了”pp”.其中”pp”,”pa”都表示地址,而”*pa”,”*pp”都表示具体的值。打印输出的时候
“printf(“a=%d,pa=%d,pp=%d”,a,pa,pp);”,大家可以看到a是代表数值的,”pa、pp”都代表的是地址,此刻输出就成了”pa、pp”的临时地址。所以会看到”pa=4040,pp=4295″这样的输出是正常的,当然英文版的输出结果”pa=-60,pp=-60″,结果是负值,表示有错误。在win-tc下用结果是”pa=-70,pp=-70″。正确的打印输出格式:”printf(“a=%d,pa=%d,pp=%d”,a,*pa,*pp); ”。”*pa,*pp”两个代表数值。结果输出正确。这样才可以和”%d”形成对应关系。
-
近期文章
近期评论
- coolker 发表在《打造最快的Hash表》
- struggle 发表在《提供C语言教学课件(适用于初学者)》
- zhanghaibo 发表在《提供C语言教学课件(适用于初学者)》
- zhanghaibo 发表在《提供C语言教学课件(适用于初学者)》
- diys 发表在《C语言编程宝典(王大刚) 1.1 C 语言的产生与发展》
文章归档
- 2022 年十月
- 2014 年一月
- 2013 年十二月
- 2012 年十一月
- 2012 年七月
- 2012 年六月
- 2012 年五月
- 2012 年四月
- 2012 年三月
- 2012 年二月
- 2011 年十二月
- 2011 年十月
- 2011 年九月
- 2011 年八月
- 2011 年七月
- 2011 年六月
- 2011 年五月
- 2011 年四月
- 2011 年三月
- 2011 年二月
- 2011 年一月
- 2010 年十二月
- 2010 年十一月
- 2010 年十月
- 2010 年九月
- 2010 年八月
- 2010 年七月
- 2010 年六月
- 2010 年五月
- 2010 年四月
- 2010 年三月
- 2010 年二月
- 2010 年一月
- 2009 年十二月
- 2009 年十一月
- 2009 年十月
- 2009 年九月
- 2009 年八月
- 2009 年七月
- 2009 年六月
- 2009 年五月
- 2009 年四月
- 2009 年三月
- 2009 年二月
- 2009 年一月
- 2008 年十二月
- 2008 年十一月
- 2008 年十月
- 2008 年九月
- 2008 年八月
- 2008 年七月
- 2008 年六月
- 2008 年五月
- 2008 年四月
- 2008 年三月
- 2008 年二月
- 2008 年一月
- 2007 年十二月
- 2007 年十一月
- 2007 年十月
- 2007 年九月
- 2007 年八月
- 2007 年七月
- 2007 年六月
- 2007 年三月
- 2007 年二月
- 2007 年一月
- 2006 年十二月
- 2006 年十一月
- 2006 年十月
- 2006 年九月
- 2006 年八月
- 2006 年七月
- 2006 年六月
- 2006 年五月
- 2006 年四月
- 2006 年三月
- 2006 年二月
- 2006 年一月
- 2005 年十二月
- 2005 年十一月
分类目录
功能
我觉得那位网友的话倒不是很确切
1、首先,他说道”“int *pa;”表示指针类型pa中存储的值是整形。“ 这是不对的。他应该表示pa的值是一个地址,这个地址指向某个整数变量。
2、又有一句:”*pp=pa”这个用法和前面的一样是把”pa”的地址存储进了”pp”.这也是有误的。事实上,前面pa定义时初值为a的地址,而执行语句 int *pp=pa后,pp的值显然为pa的值也即是a的地址,而非所谓的”pa“的地址
不过,我没用过Win TC所以不知道这到底是什么原因,也许是Win TC本身的不完善吧,谁知道呢。我还是建议大家其实可以换一换编译环境,比如VC或DevC++等,毕竟这些环境很方便,不论是调试还是写代码时,都很适合一些初学者的~~
看不懂…郁闷了!
指针输出格式 用%u、%p的话,pa和pp的值相等,%d不知道为什么不行
感谢楼主啊