C语言中利用Swap函数交换变量a,b
常见错误写法
error1
void Sawp_error1(int a,int b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}
int main()
{
int a=10;
int b=20;
Sawp_error1(a,b);
printf("%d %d\n",a,b);
return 0;
}
PS
局部变量:定义在函数内部的变量只能在函数内部使用。
上面代码里在main函数中定义的a,b与Swap函数中a,b只是同名,只在Swap函数中交换a与b的值而不影响main函数中的a与b的值。
error2
void Sawp_error2(int *p1,int *p2)
{
int *tmp;
tmp=p1;//将a的地址赋值给tmp
p1=p2;
p2=tmp;
}
int main()
{
int a=10;
int b=20;
Sawp_error2(&a,&b);
printf("%d %d\n",a,b);
return 0;
}
PS
在上面代码中Swap函数虽然使用指针,但仅仅修改的只是指针,交换a和b的地址,对于main函数中a和b的值并未交换。
error3
void Sawp_error3(int *p1,int *p2)
{
int *tmp=*p1;//野指针
*p1=*p2;
*p2=*tmp;
}
int main()
{
int a=10;
int b=20;
Sawp_error3(&a,&b);
printf("%d %d\n",a,b);
return 0;
}
PS
Swap函数中出现野指针,不能访问的指针,出现程序崩溃。
野指针(悬挂指针):没有访问权限的指针,这个指针有可能存在也有可能不存在,但是你不能访问。(野指针不好判断)
1、地址不存在(例如电话号码少一位)。
2、地址存在,但是不能访问(例如电话号码写成别人)。
3、地址之前可以访问,但现在不可以(更换电话号码)。
正确写法
void Sawp(int *p1,int *p2)
{
int tmp;
tmp=*p1;//tmp=a
*p1=*p2;//a=b
*p2=tmp;//b=tmp
}
int main()
{
int a=10;
int b=20;
Sawp(&a,&b);
printf("%d %d\n",a,b);
return 0;
}
结论
一个函数(父函数)调用另一个函数(子函数),想通过子函数修改父函数的数据,必须传指针,子函数内部解引用。也就是子函数的改变要想影响父函数的数据必须传指针和解引用。
error1中既没有指针也没有解引用,error2中只是传指针但在Swap函数中没有使用解引用 error3中传了野指针导致程序崩溃。