C语言自定义交换函数(swap)的使用(转载)
(2011-02-20 21:04:29)
标签:
形式参数c语言交换函数传递it |
分类: C |
转载:http://www.slyar.com/blog/c-swap-pointer.html
今天同学给了我一道题的代码,说他自己找了半天错误也没有AC那道题,让我给看看。拿到代码看了一下,发现一个很严重的误区,专门写出来说一下。全部代码我就不贴了,我只是就那个误区构造了一段错误的代码。
#include <stdio.h>
void swap(int x,int y)//这是错误的写法
{
int temp;
temp=x;
x=y;
y=temp;
}
int main()
{
int a=5,b=8;
swap(a,b);
printf("%d %d\n",a,b);
return 0;
}
代码很容易理解,就是交换2个变量a和b的值并输出,但是运行后我们发现输出结果不是"8 5"而依旧是"5 8",也就是说交换函数并没有将2个变量的值交换,这是为什么呢?
我们知道,C语言中整型变量的形式参数传递的是值而不是地址,也就是形式参数实际上是复制了实际参数的值进入函数运算的,而被复制的实际参数的值并没有改变。就这段代码来说,就是形参x复制了a的值变成5,形参y复制了b的值变成8,然后在swap函数中进行交换,使得x=8,y=5,但实际上a和b的值并没有被交换,这也就是为什么这段代码并没有实现交换的原因。
那么怎么解决呢?
先前我们说了C语言中整型变量的形式参数传递的是值而不是地址,那么现在我们就让它传递地址,直接交换实际参数的值。
#include <stdio.h>
void swap(int *x,int
*y)//使用指针传递地址
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
int main()
{
int a=5,b=8;
swap(&a,&b);
printf("%d %d\n",a,b);
return 0;
}
我们使用指针变量来进行地址传递,形式参数为变量a和b的地址,swap函数直接交换a和b的地址所指向的值。这里一定注意形式参数传递的是地址而不是值。
使用引用来实现swap()
#include<iostream>
using namespace std;
void swap(int &px,int &py);
int main()
{
int x=5,y=6;
cout<<"x="<<x<<"
swap(x,y);
cout<<"after
swap:"<<endl;
cout<<"x="<<x<<"
return 0;
}
void swap(int &px,int &py)
{
int temp;
temp=px;
px=py;
py=temp;
}
引用-------引用是别名,创建引用时,您将其初始化为另一个对象(即目标)的别名,然后引用将成为目标的另一个名称,对引用的任何操作都是针对目标的。
如:
#include<iostream>
using namespace std;
int main()
{
int intone;
int &rone=intone;
intone=5;
cout<<intone<<"
return 0;
}
可知 intone、rone均为5;
对intone、 rone的任一个操作,两者改变一样。