关于用指针交换两个数

关于用指针交换两个数

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

----- 完

  • 15
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值