【C语言】交换函数

一、利用第三个变量交换

1.错误的交换函数及原因

void swap1 (int x, int y)
{
    int z = 0;
    z = x;
    x = y;
    y = z;
}

    int a = 10;
    int b = 20;
    printf("交换前:a=%d,b=%d\n",a,b);
    swap1(a, b);
    printf("swap1交换后:a=%d,b=%d\n",a,b);

原因:传值调用函数,不可以改变实参的值。形参是实参的一份临时调用。

调用swap1(a,b)->  内存中又开辟了两个新的空间x和y  ->  将a中的值10传给x,将b中的值20传给y  ->  在swap1函数内部将x和y的值进行交换  ->  函数调用结束,形参消失  ->  只是将传过去的形参的值进行了交换,实际上a和b的值并没有被交换

2.正确的交换函数

void swap2 (int* pa,int* pb)
{
    int z = 0;
    z = *pa;
    *pa = *pb;
    *pb = z;
}

    int a = 10;
    int b = 20;
    printf("交换前:a=%d,b=%d\n",a,b);
    swap2(&a, &b);
    printf("swap2交换后:a=%d,b=%d\n",a,b);

原因:传址调用函数,可以改变实参的值。可以通过形参操作实参。

调用swap2(a,b)->  内存中又开辟了两个新的空间pa和pb  ->  将a的地址传给pa,将b的地址传给pb  ->  swap2函数内部通过*pa找到a,通过*pb找到b,在借助z将*pa和*pb的值交换(即将a和b的值借助z交换) ->  函数调用结束,a和b的值被交换 

总结:函数内部想改变(操作)函数外面  ->  传址调用

           只是想使用一下这个值  ->  传值调用

二、不利用第三个变量交换

利用按位异或来进行交换

void swap (int* a,int* b)
{
    *a = *a^*b;
    *b = *a^*b;
    *a = *a^*b;
}

    int a = 3;
    int b = 5;
    printf("交换前:a=%d b=%d\n",a,b);
    a = a^b;
    b = a^b;
    a = a^b;
    printf("交换后:a=%d b=%d\n",a,b);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值