矿用防尘网:帮忙看看这个程序

来源:百度文库 编辑:神马品牌网 时间:2024/05/06 12:09:55
#include<stdio.h>
sub1(char a,char b){char c;c=a;a=b;b=c;}
sub2(char a,char b){char c;c=*a;*a=b;b=c;}
sub3(ch*a,char b){char c;c=a;*a=*b;*b=c;}
void main()
{
char a,b;
a='A';b='B';sub1(a,b);putchar(a);putchar(b);
A='A';b='B';sub2(&a,b);putchar(a);putchar(b);
A='A';b='B';sub3(&a,&b);putchar(a);putchar(b);
Putchar('\n');
}

运行结果为ABBBBA
为什么啊,第一个为什么没互换啊

因为第一个sub函数是传值函数,在实参传过去之后会复制一个副本,然后在函数内部用副本进行交换,所以与调用函数的实际参数无关,也就是说在sub1函数内部,a和b是交换了的.

后两个是由于传递了指针,所以就是直接改变了实参,也就能交换了.

因为你的sub1是按值传的参数,实际上是把'a'和'b'复制一份传过去了,你修改的只是副本,实际的参数没变,而你打印到控制台的是你的实际参数。如果是按义勇传递就是把参数的内存地址传过去,这样修改的就是你传的参数了。
(本人文字功底不强,谅解!)