加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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<<"  "<<"y="<<y<<endl;
swap(x,y);
cout<<"after swap:"<<endl;
cout<<"x="<<x<<"  "<<"y="<<y<<endl;
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<<"  "<<rone<<endl;

return 0;

}

可知 intone、rone均为5;

对intone、 rone的任一个操作,两者改变一样。

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有