值传递、地址传递和引用传递

  1. 值传递

[plain] view plain copy
void swap1(int x, int y)
{
int tmp=x;
x=y;
y=tmp;
print(“x=%d, y=%d\n”, x, y);
}

void main()
{
int a=2,b=7;
swap1(a,b) ;
printf(“a=%d, b=%d\n”, a, b);
}
输出结果是什么?


x=7, y=2

a=2, b=7

  1. 地址传递

[plain] view plain copy
void swap2(int *px, int *py)
{
int tmp=*px;
*px=*py;
*py=tmp;
print(“*px=%d, *py=%d\n”, *px, *py);
}

void main()
{
int a=2;
int b=7;
swap2(&a,&b);
Print(“a=%d, b=%d\n”, a, b);
}

这次输出结果是什么?

*px=7, *py=2

a=7, b=2

  1. 引用传递

[plain] view plain copy
void swap3(int &x, int &y)
{
int tmp=x;
x=y;
y=tmp;
print(“x=%d, y=%d\n”, x, y);
}

void main()
{
int a=2;
int b=7;
swap3(a,b);
Print(“a=%d, b=%d\n”, a, b);
}

那这次输出结果又是什么?

x=7, y=2

a=7, b=2
先看值传递。swap1函数的操作是将x,y进行对调。需要注意的是,对形参的操作不会影响到a,b。我们可以设想,在swap1函数执行语句的最前面,隐含地存在x=a; y=b;这两条语句,这样就便于理解了。当a,b把值赋给x,y之后,对x,y不论再做什么操作,都不会影响到a,b本身。

再看地址传递。注意,这时的函数的声明和调用的写法与值传递不同。

**函数声明:swap2(int *px, int *py)
函数调用:swap2(&a, &b)**

但是与值传递的分析一样,我们同样可以设想,在swap2函数里,隐含地存在px=&a; py=&b;这两条语句,这表示a的地址代入到了px,b的地址代入到了py。这样一来,对*px, *py的操作就是a,b本身的操作。所以a,b的值被对调了。

接下来看引用传递。先看函数的声明和调用的写法,函数调用和值传递的写法是一样的,但是函数声明是不一样的。

**函数声明:swap3(int &x, int &y)
函数调用:swap3(a, b)**

因为定义的x,y前面有&取地址符,调用函数swap3时,a,b分别代替了x,y,即x,y分别引用了a,b变量。因此,函数里的操作,实际上是对实参a,b本身的操作,其值发生了对调

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值