交换数值

*初学c语言时,大家一定在主函数里面写过交换两个数得函数,那么怎么写一个交换函数,主函数调用来实现数值交换呢?下面我们来看看:

  • [1] 你是不是这样写的呢:
# include <stdio.h>
void swap(int a,int b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}
int main()
{
int a=10;int b=10;
printf("%d,%d",a,b);
}

这个结果可能和你想的不一样吧,那么为什么呢?大家如果有VS2012可以自己通过调试看一下主函数里的a和swap里面得a是一个a吗(通过地址来看,若地址一样,则证明是一个a),小编在这里就直接将结果画出来啦
在这里插入图片描述
这样写就错了。由上图可见,要想顺利交换a,b的值,必须穿过中间的线,那么这就要考虑谁可以实现这个功能呢,那就是指针,在主函数里传入地址,让swap函数里的指针可以保存变量的地址,将它的地址交换。

  • [2 ]是不是觉得加个指针和取址运算符就好了,你是不是写的和下面一样呢:
void swap (int *p1,int *p2)//p1保存了a的地址,p2保存了b的地址
{
int *tmp;
tmp=p1;//把p1的内容给tmp,即a的地址
p1=p2;
p2=tmp;
}
int main()
{
int a=10;
int b=20;
swap(&a,&b);//传入地址
printf("%d,%d",a,b);
}

错误实例2
这个还是错的。为了得到p1和p2指针里面的值,我们就要用到“*”解引用这个符号,用它让取到p1和p2里面的值,再将其交换,便可以实现数值交换。

  • [3 ] 加个解引用,?啊,那就加上,看看是不是和我下面的一样呢:
void swap (int *p1,int *p2)
{
int *tmp;
*tmp=*p1;
*p1=*p2;
*p2=*tmp;
}
int main()
{
int a=10;
int b=10;
swap(&a,&b);
printf("%d,%d",a,b);
}

这下你是不是感觉自己肯定写对了,地址传了,指针解引用了,也交换了,自己信心满满点运行,发现程序崩溃,原因竟是tmp未初始化,你看了一下代码说,初始化了啊,int *类型的啊。其实吧,你错不在这,你是错在了下一句(*tmp=*p1),你试图给tmp所指向的地址赋p1的值,但是p1并没有这个权限。这就要引出一个概念:
野指针(悬挂指针):别人没有权限访问这个指针的地址,所以在程序运行时它会崩溃。*tmp便是这样的一个指针。所以程序会崩溃。所以我们用整形来保存它的地址,就不会出现这种问题了。

  • [4] 那现在小编来给出正确的写法吧
# include <stdio.h>
void swap(int *p1,int *p2)
{
int tmp;
tmp=*p1;
*p1=*p2;
*p2=tmp;
}
int main()
{
int a=10;
int b=20;
swap(&a,&b);
printf("a=%d,b=%d",a,b);
}

结果截图:
在这里插入图片描述

看了上面那麽多错误和正确的写法,小编相信大家一定总结出来了自己写的函数要改变主函数主函数的值的要领了吧:传参数,解引用两者缺一不可,主函数传入参数,子函数进行解引用,再进行运算。
下次见!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值