赞
踩
本篇文章通过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是错误的函数,并没有起到交换作用。
为什么函数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的值并没有被交换
}
{
//同理 我们的函数再申请了两个指针变量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的值也没有交换
}
嗯,仔细观察的小伙伴就会发现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的值最后进行了交换
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。