关于C语言基础的,最好解释得详细点。

#include <stdio.h>void fun(int *a,int *b,int *c){ int *temp; temp=a; a=b; b=temp; *temp=*b; *b=*c; *c=*temp;}
int main(){ int a,b,c,*p1,*p2,*p3; a=5; b=7; c=3; p1=&a; p2=&b; p3=&c; fun(p1,p2,p3); printf("%d,%d,%d\n",a,b,c); return 0;}
为什么这个程序运行的结果是3,7,3而不是3,7,5呢?

temp=a; a=b; b=temp;这三语句不是将a,b指针交换吗?然后*temp=*b; *b=*c; *c=*temp;是将b和c的值交换,由于前面的a、b指针已交换,也就是说是将a、c值交换。但结果却不是这样的。

求解释。

这个有点儿抽象。

首先,fun中a,b,c是新建的指针,与main中的a,b,c的指针不一样;

     temp=a; a=b; b=temp;将a,b所指向的地址交换,即b->5,a->7,c->3;

    上一步有一点非常关键,temp=a;即temp指向第一个内存单元,即*temp=5,这是后面正确与否的关键;

     *temp=*b; *b=*c; *c=*temp;虽然看起来像是交换b,c的值,即5<->7.实际上由于temp指向第一个内存单元(与b指向同一个),*b=*c;将c中的值(即3)赋给b,此时temp中的值为3,当然c也为3.此时三个内存单元分别为b->3,a->7,c->3

    输出是,按定义时三个内存的顺序输出,即a=3,b=7,c=3

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-01-09
temp=a;
a=b;
b=temp;
结果是b=temp=a
所以后面的
*temp=*b;
*b=*c;
*c=*temp;
把b=temp=a代进去相当于
*a=*a; //a=5
*a=*c;//a=3
*c=*a;//c=3
所以a=3,b=7,c=3本回答被提问者和网友采纳
第2个回答  2014-01-09
void fun(int *a,int *b,int *c)
{
int temp;
temp=*a;
*a=*c;
*c=temp;
}
你那个fun()函数写的比较乱,没什么可说的
第3个回答  2014-01-09
堆栈么??

C语音怎么学啊,要详细点的说法!
学习C语言始终要记住“曙光在前头”和“千金难买回头看”,“千金难买回头看”是学习知识的重要方法,就是说,学习后面的知识,不要忘了回头弄清遗留下的问题和加深理解前面的知识,这是我们学生最不易做到的,然而却又是最重要的。学习C语言就是要经过几个反复,才能前后贯穿,积累应该掌握的C知识。 那么,我们如何学...

C语言程序求分析,最好每行都详细说明下,尤其是中间2行for循环读着很乱...
1.双重循环对for语句在表达式括号后面不要加;(分号,能看见吧?),你加了分号意味着for不做任何动作,这是合法但是毫无意义的。所以你的程序只是执行了*q=*p;*q=‘\\0';printf三句,而str2根本未初始化!那么打印出来的东西是未知的或者是空。2.解决了上述问题之后,编译执行你发现输出窗口黑色的...

我想学习C语言。求高手指点应该怎么做?
1、学习C语言,要从入门到精通,需要读哪些书(从简单的到难的排序,越详细越好,最好都能注释下选择这本书的理由)?入门阶段:还是老谭那本。理由:虽然不能说它写得有多好,但是你现在要做的是入门,要快速的掌握c的基本语法,这本书很好理解,能够让你在最短的时间内大致掌握这门语言的概更。

c语言基础问题
K++ 就是 K本身加1 如果k=1, 执行 k++ 后 k=2 K++ 就是 K本身加1 K--类似,k=1, 执行 k-- 后 k=0 C语言中,和其他不一样的,是K前后缀操作的问题 比如: K++,是先取K,操作,然后对K 加1.如果在等式中,就要注意了。int a = 10;int k = 8;a = k++;先把k 赋值给a,...

自学C语言要先学习什么呢?
首先,在学习C语言之前,应该学好计算机基础。里面的很多概念对于C程序员都是非常重要的。如果你在着手学习C之前,或者已经开始学习C,但是碰到了很多问题,应该再把计算机基础的书拿来好好看看。 如果你有足够的耐心,十足的毅力,应该再学习C语言之前学学汇编,这会让你对许多比较细腻的概念有清醒的认识,如果你不是那么...

自学c语言 零基础 看什么书 该怎么学
《《啊哈C语言:小学生坐在马桶上都可以读懂的C语言编程入门书》.zip》百度网盘资源免费下载 链接:https:\/\/pan.baidu.com\/s\/1aEXrb1oxnRmMWUlafELpfQ 提取码:pusr啊哈C语言:小学生坐在马桶上都可以读懂的C语言编程入门书

C语言入门级提问
这是因为楼主对y++没有理解清楚,y++是先输出y的值,然后y的值再加1的。你要是在这个printf语句后面再加一个printf("%d",y);你就会发现,现在y的值才等于3的。

C语言中的问题不明白为什么 新人麻烦详细解释一下谢谢
这里scanf指定逗号为输入的分隔符号。所以输入时数字和字符之间必须有逗号。scanf不指定分隔符时,默认以空白字符(空格、回车、制表符)为分隔符。PS:如果写%d%c不指定分隔符号。由于第二个变量是字符型,输入时中间不要加空格符,否则会将空白符号做为字符接收。

c语言编程怎样入门
(1)基础教材选择-系统又通俗易懂,最好有该书配套免费视频 建议选择系统正统的大学教材,尽量不要选择“多少天精通C语言”等吸引眼球的教程,相信一点C语言学习没有速成。这里给大家推荐一本不错的入门教程:清华大学出版社-孙海洋-C语言程序设计,讲解很透彻、知识点很全面、例程较多且通俗易懂。优酷...

c语言哪个老师讲得好
首先,耿源老师注重基础知识的讲解,他会详细解释C语言中的语法规则、变量类型、运算符以及函数等基础概念,让学生对这些基础知识有深刻的理解。其次,耿源老师会在教学过程中穿插很多实用的编程技巧和经验,这些技巧对于提高编程效率和解决常见问题非常有帮助。此外,他还会分享一些实际项目中的案例,帮助学生更...

相似回答