下面是几个交换两个数字的函数,分析以下程序,看结果是否正确???
**一、**error
#include <stdio.h>
void Swap_err1(int a,int b)//error1
{
int tmp = a;
a = b;
b = tmp;
printf("%d,%d\n",a,b);
}
int main()//父函数
{
int a = 10;
int b = 20;
printf("a=%d,b=%d\n",a,b);
Swap(&a,&b);//子函数
printf("a=%d,b=%d\n",a,b);
return 0;
}
运行上面程序,结果是:
a=10,b=20;
a=20,b=10;
a=10,b=20;
对结果进行分析,第一行的a和b是main函数中的,输出的第二行是Swap()函数中a和b值,第三行的a,b又是main()中的,然而我们发现主函数中的a,b值并没有交换
调试过程发现如下:
main()函数中定义了a和b,a的地址为 f6b0,b的地址为f6b4, 进入Swap()中,并且将a和b的值传给了Swap()中的a,b. 虽然a,b这个变量名相同,但是我们发现地址并不同,所以对a和b交换,只是交换了Swap()中的a,b的值,并没有影响到main()中的a和b的值,不能达到要求。
总结: 子函数不能影响到父函数
**二、**error
代码如下:
void Swap_err2(int *p1,int *p2)
{
int *tmp = p1;
p1 = p2;
p2 = tmp;
}
分析这个代码 ,
将a和b的地址传给了p1,p2, 所p1,p2以中分别保存的是a和b的地址;
int *tmp = p1,是将p1(即a的地址)赋值给tmp,
p1 = p2;p2(即b的地址)赋值给p1,
p2 = tmp;tmp(即a的地址)赋值给p2
因此这个函数只是交换了a和b的地址,值并没有被改变
**三、**error
代码如下:
void Swap(int *p1,int *p2)
{
int tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
代码分析如下:
*tmp是个野指针,tmp会导致程序出错
四、 ok
代码如下:
void Swap(int *p1,int *p2)
{
int tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
分析:
p1,p2以中分别保存的是a和b的地址;
*p1即是a的值,
*p2即是b的值;
tmp = *p1;
*p1 = p2;
p2 = tmp;
交换p1和p2,即达到了交换了a和b的值
总结:子函数的改变能够影响到父函数,一定要传指针和解引用,两个条件缺一不可