目录
1.错误版本
先说几个常见的错误版本:
版本1
代码如下:
void Swap(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
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,b为局部变量,其作用域在函数内部,实参和形参隶属与两个函数空间 ,上述操作是值传递,修改的是实参的副本。
版本2.传指针
代码如下:
void Swap(int* p1, int* p2)
{
int* tmp = p1;
p1 = p2;
p2 = tmp;
}
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;
}
程序执行结果:
没有交换成功,只传指针,没有解引用,交换的是指针而不是指针所指向的变量的值。
版本3.传指针,解引用
代码如下:
void Swap(int* p1, int* p2)//编译错误,老的编译器程序崩溃
{
int* tmp;//tmp的值是随机值或者-858993460(0xcccccccc)
*tmp = *p1;//错误
*p1 = *p2;
*p2 = *tmp;
}
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;
}
程序编译出错
,
老的编译器
(vs2012,DEVC++,VC6.0
等
)
程序能运行但在
*tmp=*p1;
这句崩溃
.
因为第三行代码定义了一个野指针tmp,其保存的地址不能被访问。
野指针
:
也称悬空指针
,
悬挂指针
,
你没有访问权限的地址
(
指针
).
2.正确版本
代码如下:
void Swap(int* p1, int* p2)
{
int tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
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;
}
程序运行成功
结论:调用函数通过形参想修改实参的值,必须1.传指针 2.解引用
3.不通过第三个变量交换a,b的值
代码如下:
int main()
{
int a = 10;
int b = 20;
a = a + b;//a:30,b:20
b = a - b;//a:30,b:10
a = a - b;//a:20,b:10
//a ^= b;//不要使用,有bug
//b ^= a;
//a ^= b;
printf("%d,%d\n",a,b);
return 0;
}