c语言实例:交换两个数的值

一.学过函数前

#include<stdio.h>
int main()
{
int t;
int a,b;
scanf_s("%d%d",&a,&b);
t=a;
a=b;
b=t;
printf("%d %d",a,b);
}

二.学过函数后

#include<stdio.h>
void fx(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
int main()
{
int a,b;
scanf("%d%d",&a,&b);
fx(&a,&b);
printf("%d %d",a,b);
}

三.经典错误分析

#include<stdio.h>
void fx(int a,int b)
{
int t;
t=a;
a=b;
b=t;
}
int main()
{
int a,b;
scanf_s("%d%d",&a,&b);
fx(&a,&b);
printf("%d %d",a,b);
}

为什么交换不了?

1.首先我们必须理解变量的本质即使内存,定义变量其实就是在申请储存空间。就好比一栋大厦中的房子一般,每个房间就是一个储存单元。我们定义变量就好比买房子一般,获得了这个房子的使用权。

2.地址值就好比房间的门牌号,门牌号(地址值)代指得就是这个房间(储存空间),而一个房间内又住着人(变量值)。所以,我们可以发现,改变地址值就可以改变其中的变量值(门牌号不同,代指里面的人自然不会相同),而单纯的改变内存中的变量值却没有办法改变地址值(就好比一个房间只是换了一个人住,门牌号不会变),而每一个门牌号都和里面的住户有一个对应关系(使用权)。

3.在这个典型错误中,定义的函数内部只是在交换变量值

void fx(int a,int b)
{
int t;
t=a;
a=b;
b=t;
}

而函数内部所定义的形参和局部变量是具有生命期的,当函数调用结束后。系统将自动释放其所占用的内存,也就意味着函数内部的啊a,b所占有的储存空间将被释放。那么a,b所对应的函数值自然也会消失,而main函数中a,b变量地址与其内部变量值之间的对应关系没有任何改变。自然无法完成交换。

然后来看看正确的函数

void fx(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}

这个为什么就行了呢?

1.a,b为指针变量,其所获得的是main函数中a,b的地址值。在a,b前加*即返回a,b地址所对应的变量值,所以这个函数实际上就是在利用指针变量作为桥梁修改a,b地址所对应的变量值。本质上修改的是一个地址与变量值之间的对应关系。

2.函数调用结束后,函数中所定义的两个指针变量a,b虽然会消失,但main函数中a,b变量地址值所对应的函数值已经被修改,这个对应关系的改变是不会随着形参的消失而消失的。

再来看一遍错误的函数

void(int a,int b)
{
int t;
t=a;
a=b;
b=t;
}

这次就不难理解错误原因了,想要利用函数修改变量值,必须从地址与函数值的对应关系上入手,修改这层对应关系,才能做到真正的修改变量值。而上面的函数之所以错,也正是因为他只是单纯的在修改变量值。想利用外在力量(函数)赶走房间里的住客(变量值)当然不可能如此轻易。所以,我们只有修改使用权(地址与变量值的对应关系),才能令房中(储存空间)易主(变量值改变)。

知错而后能改     本人不才,还望各位大佬们多多指教!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值