自定义交换函数swap的误区

废话不多说,直接上代码大家直接查看下列4个函数中,哪个代码是正确的那个能交换主函数中x,y的值:

//swap交换两个变量之间的值

//值传递 无法交换main函数里面的值
void swap1(int x,int y)
{
    int ret=x;
    x=y;
    y=ret;
}

//地址传递,交换的是函数内部x,y的地址,外部没有受到任何影响
void swap2(int* x,int* y)
{
    int *p=x;       //p指向外部的x
    x=y;            //x指向外部y
    y=p;            //y指向外部x
        
    //上面三步骤 仅仅改变了在函数内部的 x,y指针的变量
    //外部的x,y的值没有受到任何的影响
}

//地址传递,交换的是值
void swap3(int* x,int* y)
{
    int ret=*x;                                                                                        
    *x=*y;
    *y=ret;
}

//值传递 非法给一块没有初始化的空间赋值
void swap4(int* x,int* y)
{
    int *p;
    *p=*x;
    *x=*y;
    *y=*x;
}

#include<stdio.h>
int main(int argc, const char *argv[])
{
    void (*p)(int* x,int* y);           //定义一个函数指针

    int x=55;
    int y=66;
    printf("调用函数前,x=%d,y=%d\n",x,y);
    swap1(x,y);
    printf("调用函数后,x=%d,y=%d\n\n",x,y);

    p=swap2;
    printf("调用函数前,x=%d,y=%d\n",x,y);                                                             
    (*p)(&x,&y);
    printf("调用函数后,x=%d,y=%d\n\n",x,y);
    
    p=swap3;
    printf("调用函数前,x=%d,y=%d\n",x,y);
    (*p)(&x,&y);
    printf("调用函数后,x=%d,y=%d\n\n",x,y);

    p=swap4;
    printf("调用函数前,x=%d,y=%d\n",x,y);
    (*p)(&x,&y);
    printf("调用函数后,x=%d,y=%d\n\n",x,y);

    return 0;
}

上述情况中
只有swap3能实现交换x,y的值,运行结果为:

在这里插入图片描述

swap1()函数只在函数内部交换x,y的值,与外界x,y的值无关;

sawp2()函数在函数内部交换的x,y的地址,与外界x,y的地址和值无关;

swap3()函数在内部操作了外界 x,y 的值。成功交换x,y的值

swap4()函数在内部非法操作没有初始化的指针。即操作了野指针。会直接中断程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值