注册 登录
编程论坛 C++教室

[求助]关于swap函数

六道 发布于 2007-10-19 22:34, 1846 次点击

swap(a,b);
void swap(int x,int y)
{
int temp=x;
x=y;
y=temp;
}
不能交换a,b值


swap(&a,&b);
void swap(int *x,int *y)
{
int temp=*x;
*x=*y;
*y=temp;
}
交换了a,b的值


一直想不通为何的一个不行?有朋友能解释详细点么?
14 回复
#2
Janlex2007-10-20 01:10
void swap(int x,int y)
{
int temp=x;
x=y;
y=temp;
}

int main()
{
int a = 3;
int b = 5;
swap(a,b);
}

swap参数x, y其实就是复制a, b的值。

你说,x, y交换后, 对a,b的值有影响吗?
#3
aipb20072007-10-20 10:23
参看 按值调用和按引用调用
#4
六道2007-10-20 19:59

谢谢~

#5
蓝莲之鸟2007-10-21 13:05

行参和实参类型都不一致,当然不能传递值了

#6
六道2007-10-21 15:04
以下是引用蓝莲之鸟在2007-10-21 13:05:08的发言:

行参和实参类型都不一致,当然不能传递值了

类型没错,应该是实参传向行参是单向的,虽然x,y交换了,但不会影响a,b的值.
但void swap(int *x,int *y)这个交换*x,*y值后,swap(&a,&b)后&a,&b地址里面的值发生交换了.所以a,b交换了.

个人理解,不对的话请楼下指出~

#7
nuciewth2007-10-22 10:31
以下是引用aipb2007在2007-10-20 10:23:02的发言:
参看 按值调用和按引用调用


明明是指针嘛.

#8
nuciewth2007-10-22 10:39
值传递是不会改变实参的.
用地址来传递是改变地址里面的值,不会改变地址(相对行参来说也是个值).
#9
nuciewth2007-10-22 10:39

拿这个来一个一个测试就知道了.
#include<stdio.h>
void swap1(int x,int y)
{
int temp=x;
x=y;
y=temp;
}

void swap2(int &x,int &y)
{
int temp=x;
x=y;
y=temp;
}

void swap3(int *x,int *y)
{
int temp=*x;
*x=*y;
*y=temp;
}

void swap4(int *x,int *y)
{
int *temp=x;
x=y;
y=temp;
}

int main()
{
int a = 3;
int b = 5;
printf("a=%d\nb=%d\n",a,b);
swap4(&a,&b);
printf("a=%d\nb=%d\n",a,b);
return 0;
}

#10
jxnuwy042007-10-22 12:27
以下是引用nuciewth在2007-10-22 10:31:04的发言:


明明是指针嘛.

指针就是引用类型,引用类型传递的是地址,而值类型形参只是实参的一个拷贝。

#11
nuciewth2007-10-22 14:27
以下是引用jxnuwy04在2007-10-22 12:27:11的发言:

指针就是引用类型,引用类型传递的是地址,而值类型形参只是实参的一个拷贝。

就是说指针和引用没有区别?

#12
jxnuwy042007-10-22 15:42

就相当于int,char都是值类型,而指针,数组等都是引用类型,明白了不?

#13
nuciewth2007-10-22 16:19
我一直不这样看
引用和指针是有区别的.
#14
aipb20072007-10-22 19:25
这是个说不清楚的话题。指针,地址,引用!!!
#15
随心2007-10-23 14:41
指针就是地址,引用就是绑定,这样说不错吧?
1