【C语言学习笔记】SWAP函数详解

SWAP函数详解

本篇文章通过swap函数来深入了解C语言中函数的用法,与指针的应用。参考资料来源于经典书籍与技术博客的分享。

在复习完生存期相关的知识点后(详情可转至此处),初步认识了函数与本地变量,今天再详细梳理几种主流的swap函数写法,并通过代码的替换帮助大家了解本质。


代码整合展示

#include <stdio.h>

//w_swap即wrong swap 展示了两个常见的错误swap函数 
void w_swap1( int a, int b )
{
	int temp;
	temp = a;
	a = b;
	b = temp;
} 

void w_swap2( int *a, int *b )
{
	int *temp;
	temp = a;
	a = b;
	b = temp; 
}

//r_swap即right swap 展示了常见的正确swap函数 
void r_swap3( int *a, int *b )
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

int main()
{
	int a,b;
	a = 1;
	b = 2;
	
	w_swap1 ( a, b );
	printf ( "===RESULT 1===\n%d %d\n==============\n\n\n", a, b );
	w_swap2 ( &a, &b );
	printf ( "===RESULT 2===\n%d %d\n==============\n\n\n", a, b );
	
	r_swap3 ( &a, &b );
	printf ( "===RESULT 3===\n%d %d\n==============\n\n\n", a, b );
	return 0;
}
@输出结果
===RESULT 1===
1 2
==============


===RESULT 2===
1 2
==============


===RESULT 3===
2 1
==============


根据结果显而易见swap1与swap2是错误的函数,并没有起到交换作用。


深入分析:

SWAP1:

为什么函数1是错误的呢?这里我们就要了解函数的传值性质了,传进去的值并不是值本身,而是“值”,好吧,我承认,可能那么说你就蒙了,如果用书籍上的形式参数来解释可能就直接从入门到放弃了,那么我下面来写一段等量替换的代码来帮你了解SWAP1函数的本质运算过程。

{
	//因为函数中的a与b与函数外的a与b相同,所以导致读者会误以为这两个是完全一样的东西。
	//但事实上 在进入函数的时候,完成了这样的一个交接任务。
	//函数先申请了两个临时的int类型来储存即将到来的宾客(main函数里的a与b) 姑且叫它tempa与tempb
	//在main函数里面执行到了swap1( a, b );
	//这是两个临时的int类型出门迎客
	tempa = a;
	tempb = b;
	//此时完成了交接,tempa的值为a,tempb的值为b;
	//然后进入函数内部,进行了如下操作 
	int temp;
	temp = tempa;
	tempa = tempb;
	tempb = temp;
	//!!!是不是发现了什么!!!
	//对于a与b,除了一开始的交接,告诉tempa与tempb值后就再也没有出现了
	//后面值的交换也只是与tempa与tempb有关
	//自然 最后a与b的值并没有被交换 
}
SWAP2:
{
	//同理 我们的函数再申请了两个指针变量tempa和tempb
	//main函数执行到了swap2
	tempa = &a;
	tempb = &b;
	//此时tempa储存了a的地址,tempb储存了b的地址
	int temp;
	temp = tempa;
	tempa = tempb;
	tempb = temp;
	//是的,这个与swap1如出一辙,a与b在一开始的交接后就再也没有出现了 
	//最终a与b的值也没有交换 
} 
SWAP3:

嗯,仔细观察的小伙伴就会发现swap2与swap3极其相似,那为什么3就可以实现数据的交换呢?我们来看看

{
	//同理 我们的函数先申请了两个指针变量tempa和tempb
	//main函数执行到了swap2
	tempa = &a;
	tempb = &b;
	//此时tempa储存了a的地址,tempb储存了b的地址
	int temp;
	temp = *tempa;
	*tempa = *tempb;
	*tempb = temp;
	//关键的地方就在这里
	//此时因为tempa储存了a的地址 因此*tempa就是变量a本身 *tempb就是变量b本身
	//所以a与b的值最后进行了交换 
} 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值