关于用指针交换两个数

关于用指针交换两个数

西邮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 我相信也只是不在话下的,一秒钟就看穿它的本质就把它干掉了。

----- 完

猜你喜欢

转载自blog.csdn.net/Holy_666/article/details/85001245