在main函数中,对两个值进行交换,要再定义一个变量作为媒介。
int main()
{
int a = 10;
int b = 20;
int tmp = a;
a = b;
b = tmp;
printf("%d,%d\n",a,b);
return 0;
}
若是将这段交换代码提出到一个新的函数中,他就不能实现a和b的交换了,结果如下:
void Swap_err1(int a,int b)
{
int tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap_err1(a,b);
printf("%d,%d\n",a,b);
return 0;
}
进行调试并监控a和b的地址会发现,此时在main函数中a的地址fc8c(取后四位,下同),b的地址fc80,进入Swap函数中a的地址变成了fb9c,b的地址变成了fba0,值没变,由此可以知道,这只是进行了一个值传递,没有实质改变。
要对ab改变还是要传指针。接下来修改代码,传指针进去。
void Swap_err2(int *p1,int *p2)
{
int *tmp = p1;
p1 = p2;
p2 = tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap_err2(&a,&b);
printf("%d,%d\n",a,b);
return 0;
}
再进行调试,继续监视ab地址变化,可以看到这时两个函数中的ab地址一致。
此时p1指向a,p2指向b,进行接下来的交换步骤,交换的是p1和p2里的内容,也就是交换了地址,ab依旧是没有改变。
要改变ab里的值还需要对p1和p2解引用。再次修改代码。
void Swap_err3(int *p1,int *p2)
{
int *tmp;
*tmp = *p1;
*p1 = *p2;
*p2 = *tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap_err3(&a,&b);
printf("%d,%d\n",a,b);
return 0;
}
这时运行会发现程序崩溃了,系统给出的原因是指针tmp未初始化。这种未初始化的指针称为野指针,也叫悬挂指针,这是一个没有访问权限的地址。
解引用不能这样用,换一种方法。
void Swap(int *p1,int *p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap(&a,&b);
printf("%d,%d\n",a,b);
return 0;
}
调试进行监控。
交换代码中*p1=a=10,*p2=b=20,交换就是对值的交换,不再是地址。
运行成功。
总结: 一个函数想要修改另一个函数的变量值,必须传指针和解引用。(也要注意野指针的存在)