c语言高手请进!50分求答!

来源:百度知道 编辑:UC知道 时间:2024/06/15 21:52:33
fun(int *p,int *q)
{
int s;
s=*p;*p=*q;*q=s;
}
main()
{
int *p1,*p2;
int a,b;
p1=&a;p2=&b;
printf("请输入两个数字:\n");
scanf("%d%d",p1,p2);
if(a<b) fun(p1,p2);
printf("%d,%d\n",s,b);
printf("%d,%d\n",*p1,*p2);
}

和下面这个:
fun(int *p,int *q)
{
int *s;
s=p;p=q;q=s;
}
main()
{
int *p1,*p2;
int a,b;
p1=&a;p2=&b;
printf("请输入两个数字:\n");
scanf("%d%d",p1,p2);
if(a<b) fun(p1,p2);
printf("%d,%d\n",s,b);
printf("%d,%d\n",*p1,*p2);
}
这两个程序有什么不同吗,为什么答案会相反呢?百思不得其解,请各位高手详解,谢谢,如方便请留下qq号以便进一步请教。
你们说的很详细,就是有一点想再问一下,就是地址交换,为什么值会不交换?地址与值有什么区别吗?麻烦了

从整体上看不同的语句就是这两句:s=*p;*p=*q;*q=s;和s=p;p=q;q=s;
现在说明下为什么不同

在说明前我先指明一点 在一个指针变量中,比如我定义一个 int *p; p=&a;这样,那么p是一个指针变量,它指向一块整型单元, 当我在程序中用到 *P的时候你记住这一定是内容而不是地址,也就是*p=a 而单独说p的时候它一定是个地址也就是p=&a 。 总结一下对于指针变量来说 前面带上*的就指的内容,前面没加的就是指地址, 弄清这个 我们来说明下此题

首先说上边的程序,当你分别输入两个数时,如果你输入的第一个数小于第二个数此时会进入函数FUN ,形参是两地址(因为没有*)进入以后 s=*p;*p=*q;*q=s;
看到*了吧,这指的是内容的交换,也就是说此时 p指向了 a所在单元, q指向了b在单元, 当用一个s 把 *p *q交换后,p q所指向单元的内容就会交换, 在此你的p q指向没变 它扔然指向原来两个内存单元,还是指着那两个块地址, 变的是它们俩个指向的单元的内容,怎么变的? 两个值交换, 因此在函数反回时 a b两个单元内的内容就发生了改变。

下边的程序则不同了,做的是s=p;p=q;q=s; 一看没* 就说明的是针对地址,是地址的交换,地址的交换是怎么回事? 就是它们的指向发生改变, 原来是 p指a ,q指b ,现在呢交换了一下指向变成了 Q指A , P指B 。 注意只是两个指针的指向变了,你并没有改变人家A B单元内的内容,对吧? 所以反回后A B的值不会变。
它与第一个程序不同的就是 第一个程序是交换了两个指所指向单元的内容,本身指向不变,而第二个程序是指向改变,所指单元内的内容没有动。

就是这样,对于指针这部分 我认为只要记清了 *p=a, p=&a 把这个记熟你就能入门不少,并认识了 带*的是内容,不带*的是地址 这样就差不多了

地址交换只是单纯的指向发生改变,比如两个男的分别和两个女的说话,现在是1号男对1号女,2号男对2号女, 如果是指向发生改变了那就变成2号男对1号女,1号男对2号女,只是指向变,内容你没去改变, 建议作指针的题画图,把它们的指向关系都对应好,这样看