C----交换两个变量的值

本文深入剖析了C语言中常见的四个错误的数字交换函数,揭示了直接传递变量、传递地址但错误操作指针以及正确使用指针进行值交换的区别。通过实例演示,解释了为何某些方法无法实现在主调函数中交换变量值的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面是几个交换两个数字的函数,分析以下程序,看结果是否正确???
**一、**error
#include <stdio.h>

void Swap_err1(int a,int b)//error1
{
int tmp = a;
 a = b;
 b = tmp;
 printf("%d,%d\n",a,b);
}
int main()//父函数
{
int a = 10;
 int b = 20;
 printf("a=%d,b=%d\n",a,b);
 Swap(&a,&b);//子函数
 printf("a=%d,b=%d\n",a,b);

return 0;
}

运行上面程序,结果是:

a=10,b=20;

a=20,b=10;

a=10,b=20;
对结果进行分析,第一行的a和b是main函数中的,输出的第二行是Swap()函数中a和b值,第三行的a,b又是main()中的,然而我们发现主函数中的a,b值并没有交换
调试过程发现如下:

在这里插入图片描述
main()函数中定义了a和b,a的地址为 f6b0,b的地址为f6b4, 进入Swap()中,并且将a和b的值传给了Swap()中的a,b. 虽然a,b这个变量名相同,但是我们发现地址并不同,所以对a和b交换,只是交换了Swap()中的a,b的值,并没有影响到main()中的a和b的值不能达到要求。
总结: 子函数不能影响到父函数

**二、**error
代码如下:

void Swap_err2(int *p1,int *p2)
    {
     int *tmp = p1;
     p1 = p2;
     p2 = tmp;
}

分析这个代码 ,

在这里插入图片描述
将a和b的地址传给了p1,p2, 所p1,p2以中分别保存的是a和b的地址;
int *tmp = p1,是将p1(即a的地址)赋值给tmp,
p1 = p2;p2(即b的地址)赋值给p1,
p2 = tmp;tmp(即a的地址)赋值给p2
因此这个函数只是交换了a和b的地址,值并没有被改变

**三、**error
代码如下:

void Swap(int *p1,int *p2)
{
 int tmp;
 tmp = *p1;
 *p1 = *p2;
 *p2 = tmp;
}

代码分析如下:
*tmp是个野指针,tmp会导致程序出错

四、 ok

代码如下:
void Swap(int *p1,int *p2)
{
 int tmp;
 tmp = *p1;
 *p1 = *p2;
 *p2 = tmp;
}

在这里插入图片描述
分析:
p1,p2以中分别保存的是a和b的地址;

*p1即是a的值,

*p2即是b的值;

tmp = *p1;

*p1 = p2;

p2 = tmp;

交换p1和p2,即达到了交换了a和b的值
总结:子函数的改变能够影响到父函数,一定要传指针和解引用,两个条件缺一不可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值