主函数
int main()
{
int a = 10;
int b = 20;
//Swap_err1(a,b);
//Swap_err2(&a,&b);
//Swap_err3(&a,&b);
Swap(&a,&b);
printf("%d,%d\n",a,b);
return 0;
}
第一种错误:(不进行指针传递时)
子函数Swap中变量a和b仅仅只是赋值,main函数中的a和b是实参,Swap函数中的a和b是形参,它们不是同一个变量。
void Swap_err1(int a,int b)
{
int tmp = a;
a = b;
b = tmp;
}
测试结果:
10,20
第二种错误:(交换形参的地址,但没有解引用)
这种情况只是交换了形参的地址,并未对形参指向的实参的值进行修改、
void Swap_err2(int *p1,int *p2)
{
int *tmp = p1;
p1 = p2;
p2 = tmp;
}
测试结果:
10,20
第三种错误 (传指针+解引用但出现了野指针)
野指针:
没有访问权限的地址(地址可能不存在也可能真实有效),指针没有初始化,越界或者已经没有访问权限
void Swap_err3(int *p1,int *p2)
{
int *tmp; //野指针,悬挂指针,tmp是个局部变量,默认值为随机值
*tmp = *p1; //解引用时*tmp崩溃,野指针不能访问
*p1 = *p2;
*p2 = *tmp;
}
测试结果:
程序崩溃:int *tmp is not initialized
野指针不同于空指针,空指针是指一个指针的值为null,而野指针的值并不为null,野指针会指向一段实际的内存,只是它指向哪里我们并不知情,所以程序在这里崩溃了。编程时要小心避免野指针。
正确引用方法
void Swap(int *p1,int *p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
测试结果:
20,10
总结
一个函数的改变要想影响另一个函数,
必须满足两个条件:
1.传指针;2.解引用