第一类:传值
给定两个变量 a ,b 问使用 swap1函数是否实现值的交换??
void Swap1(int left, int right)
{
int tmp = left;
left = right;
right = tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap1(a, b);
return 0;
}
答案:不能
因为 left 与 right 分别是 a, b 的一份临时拷贝,因此形参 left right 的改变不会影响实参 a,b 的修改
分析:
在运行监视窗口可以看到 a, b, left , right 的空间分配地址是各不相同的,说明是四个单独的变量
由于 left right 分别是 实参 a b 的一份临时拷贝,因此交换 left 与 right 变量的内容并不会影响实参 a b 的值变化
第二类:传址
void Swap2(int *left, int *right)
{
int tmp = *left;
*left = *right;
*right = tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap2(&a, &b);
return 0;
}
此时 a, b 的值进行了交换
分析:
由于传递的是 a, b 变量的地址,因此对 *left 与 *right 变量的修改就是对 a, b 的修改
此时,left right 分别保存的是 a,b 的地址,
因此 *left => a ,
*right => b
第三类:传值
void Swap3(int *left, int *right)
{
int tmp = *left;
*left = *right;
*right = tmp;
}
int main()
{
int a = 10;
int b = 20;
int*pa = &a, *pb = &b;
Swap3(pa, pb);
return 0;
}
此时并不能修改 pa, pb 的指向
分析:
此时只是通过 pa ,pb修改了 a, b 的值,并没有修改 pa, pb 的指向
第四类:传址(重点分析)
void Swap4(int **left, int **right)
{
int *tmp = *left;
*left = *right;
*right = tmp;
}
int main()
{
int a = 10;
int b = 20;
int*pa = &a, *pb = &b;
Swap4(&pa, &pb);
return 0;
}
此时 pa, pb 的指向进行了修改
分析:
此时 left right 中存储的分别是 pa pb 的地址
pa pb 中存储的是 a b 的地址(指向如图所示)
通过二级指针来修改指针指向
ps:内容为原创,有问题欢迎留言呀~~