关于用指针交换两个数
西邮Linux 兴趣小组又到了纳新季,作为一个老学长,面试学弟学妹们的时候,必然要然他们感受到小组的关怀(受尽折磨),这一届孩子还是挺强的,但是一到指针上就栽了坑,在加上我们小组的陈年老题swap屡试不爽。所以在这里总结一下关于用一级 二级指针交换两个数字的问题。
一级指针交换
#include<stdio.h>
int swap(int *c , int *d)
{
int *q;
q = c;
c = d;
d = q;
printf("%d %d\n", *c, *d);
}
int main ()
{
int a=5, b=10;
swap(&a, &b);
printf("%d %d\n" , a, b);
return 0;
}
/*
这个得出结果是
10 5
5 10
*/
由结果来看的话,是在 swap 里边是交换成功了的。
这个原因是因为主函数调用 swap(c,d); 之后这个函数在栈上开辟了一段空间,形式参数(int *a, int *b) 是将原来主函数的(&a, &b) 完全的拷贝了一份,里边存储的是主函数的 a,b 的地址然后定义一个中间指针变量,进行交换,此时形参 c, d 内部存储的地址值确实发生了交换,以至于*c ,*d 的值确实是10, 5; 但是并未对主函数中数据块a,b 产生任何影响。当swap打印完毕之后,此函数生命周期结束,int *c , int *d 被释放掉。 然后回到主函数里,由于数据块 a, b并没有 发生任何改变所以打印出来的值才会发生没有交换。
敲黑板!!!
所以呢我们由此得出结论我们应该实实在在的交换数据块 a,b 才能成功
本着这个想法我们做出了如下改变。
#include<stdio.h>
int swap(int *c , int *d)
{
int q;
q = *c;
*c = *d;
*d = q;
printf("%d %d\n", *c, *d);
}
int main ()
{
int a=5, b=10;
swap(&a, &b);
printf("%d %d\n" , a, b);
return 0;
}
/*
这个得出结果是
10 5
10 5
*/
二级指针交换
这个在主函数里边呢,调用swap(&a, &b); 之后 在swap函数中 , 用*c, *d ,去直接访问了a ,b 所在的数据 并把他们交换, 这样在swap生命周期结束之后, main 函数 数据块a,b 中的值发生了交换最后的结果就是被改变了的。
所以本着这样的想法,那么我们就由这个形参 (int **c, int ** d) 把他们降级两次就可访问到数据块a,b。再对它进行交换即可。
#include<stdio.h>
int swap(int **a , int **b)
{
int q;
q = **a;
**a = **b;
**b = q;
printf("%d %d",**a,**b);
}
int main ()
{
int a=3, b=8;
int *p = &a,*q = &b;
swap(&p , &q);
printf("%d %d", a ,b);
}
/*
这个得出结果是
10 5
10 5
*/
如果以上的两个指针交换理解了,那么就算学长再为难你们 出一个 int *************************b,
或者 int ***********************************************************************************************b 我相信也是不在话下的,一秒钟就看穿它的本质就把它干掉了。
----- 完