《函数值的交换》
交换函数的几种方式:
(1)
//error
int Swap1(int a,int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
return 0;
}
在函数Swap1中,a和b的地址的值并没有交换。只是把10和20赋给了a和b,a和b原本的值并没有改变。
(2)
#include<stdio.h>
int Swap2(int *p1,int *p2)//error
{
int *tmp;
tmp = p1;
p1 = p2;
p2 = tmp;
return 0;
}
int main()
{
int a = 10;
int b = 20;
printf("%d %d\n",a,b);
Swap2(&a,&b);
printf("%d %d\n",a,b);
return 0;
}
在函数Swap2中,指针p1和p2分别指向a和b的地址,交换指针p1和p2,只是让指针p1指向b,指针p2指向a,a和b的值还是没有交换。
(3)
#include<stdio.h>
int Swap3(int *p1,int *p2)
{
int *tmp;
*tmp = *p1;
*p1= *p2;
*p2= *tmp;
return 0;
}
int main()
{
int a = 10;
int b = 20;
printf("%d %d\n",a,b);
Swap3(&a,&b);
printf("%d %d\n",a,b);
return 0;
}
*tmp是一个野指针,又叫做悬挂指针,野指针是指没有指向有效(能访问)的地址的指针。
注:一个指针要想修改另一个函数的数据,必须传指针和解引用
一个变量只能访问自己定义的变量,而不能随机访问一个变量,所以系统会崩溃掉。
(4)
#include<stdio.h>
int Swap(int *p1,int *p2)//true
{
int tmp;
tmp = *p1;
*p1= *p2;
*p2= tmp;
return 0;
}
int main()
{
int a = 10;
int b = 20;
printf("%d %d\n",a,b);
Swap(&a,&b);
printf("%d %d\n",a,b);
return 0;
}
这个函数里既传了指针,又进行了解引用,把*p1解引用的值a赋给tmp这个变量,把*p2解引用的值b赋给p1,把*p2解引用的值b赋给p2,这样就交换了a和b的值。