【C语言】交换函数以及它的秘密 -- 地址传递

在初学使用C进行编程时,我们必须熟悉函数的运用,并构建用函数解决问题的思想。接下来我们就从最简单的函数-- 交换函数开始讲起:

  1. 首先我们要知道交换函数的功能:交换两个变量的值
  2. 实现函数的主要思想:为了避免互相覆盖,需要先定义一个中间变量,再进行交换 – 即若交换a,b的值;那么我们需要有个c,先让c=a 存下a的值,再让a=b 将b的值赋给a,最后b=c 将c值(前面存下的a值)赋给b
  3. 函数必须使用参数的地址传递实现(原因在下文中)

下面是一个简单的交换函数的实现,供参考~

完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdlib.h>
#include <stdio.h>
void swap(int *a, int *b)
{
	int temp = 0;
	temp = *a;
	*a = *b;
	*b = temp;
}
int main()
{
	int a = 0;
	int b = 0;
	printf("请输入两个数:");
	scanf("%d%d", &a, &b);
	swap(&a, &b);
	printf("交换后的数为:%d  %d\n", a, b);
	system("pause");
	return 0;
}

在这里插入图片描述

注意:写这个交换函数时,必须是地址传递!!

这个函数的实现很简单,有没有人想问:为什么一定要使用地址传递?用值传递会发生什么呢?

想知道的话且听我慢慢讲来~
在C语言中,函数有两种传参方式:值传递和地址传递。

1. 值传递

这种方式是使用变量、常量、数组元素作为函数的参数,实际传递的是实参的值。形参接收到的只是实参的值(另外复制一份值),因此值传递时形参与实参分别占用了不同的存储单元,这种传递方式称“参数的值传递”或者“函数的传值调用”。

值传递的特点是单向传递。即主调函数调用时给形参也分配了存储单元,然后将实参值复制给形参,在调用结束后形参的存储单元就被释放,这时形参值的改变并不会影响到实参的值,也就是说实参的存储单元仍然保留原内容。

所以我们如果在写交换函数时使用值传递,那么就会出现交换函数“失效” 的现象。如下图
在这里插入图片描述

在上图失效的交换函数中,我们看到ab的值在swap函数内确实交换成功了。但是!!结果仍然是错的。原因就在于swap函数使用的是值传递。
虽然在上图中,实参与形参变量都是ab,但根据前面的分析,我们很容易就能知道这里形参a与实参的a其实是两个不同的存储空间,所以对于形参存储单元的操作,当然不会关联实参产生变化。并且看清楚,我们的swap函数返回值类型是void,即ab交换后的值并没有被传递回来,所以在main函数中,ab的值仍然没有变。

那么为什么使用地址传递就可以完成了呢?好奇的话就继续往下听~

2.地址传递

这种方式是使用数组名或者指针作为函数的参数,实际传递的内容是该数组的首地址或者指针的值。也就是说形参接收到的是实参的存储单元地址,因此地址传递时形参与实参占用的是相同的存储单元,这种传递方式称为“参数的地址传递”。

地址传递的特点是编译系统不会为形参分配新的内存,数组名或者指针就是一组连续空间的首地址。因此通过地址传送时,形参取得了该实参的首地址,然后使用指针即可实现与实参共同拥有同一段内存空间,此时对形参做的操作就会使实参也发生变化。

所以,在上面示例的交换函数中,当我们使用地址传递时,交换函数的功能就完美呈现出来啦。这里形参只是使用指针找到了实参的存储单元,然后操作了实参存储空间内的值,最终的值发生的改变实参一定是可以知晓的。

以上是我对这个交换函数的基本理解,我在其他博客中更新了两篇相关内容,感兴趣的可以通过链接查看哦~
交换函数-交换两个数组中的内容
交换思想-交换两个值的三种方法

  • 18
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值