当前位置:   article > 正文

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

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
@输出结果
===RESULT 1===
1 2
==============


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


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


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

根据结果显而易见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的值并没有被交换 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
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的值也没有交换 
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/1016514
推荐阅读
  

闽ICP备14008679号