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

本文详细介绍了C语言中值传递、地址传递和引用传递的概念,通过示例展示了它们在函数调用时的不同行为,强调了实参和形参的关系以及对变量值的影响。
摘要由CSDN通过智能技术生成

一、值传递
eg:

void Exchg1(int x, int y) /* 定义中的x,y变量被称为Exchg1函数的形式参数 */ 
{ 
	int tmp; 
	tmp = x; 
	x = y; 
	y = tmp; 
	printf("x = %d, y = %d.\n", x, y); 
} 
int main() 
{ 
	int a = 4,b = 6; 
	Exchg1(a, b); /*a,b 变量为 Exchg1 函数的实际参数。*/ 
	printf("a = %d, b = %d.\n”, a, b); 
	return(0); 
} 

输出:

a=4,b=6

理解:
函数在调用时是隐含地把实参 a、b 的值分别赋值给了 x、y,之后在你写的 Exchg1 函数体内再也没有对 a、b 进行任何的操作了。
交换的只是 x、y 变量。并不是 a、b。当然 a、b 的值没有改变啦!函数只是把 a、b 的值通过赋值传递给了 x、y,函数里头操作
的只是 x、y 的值并不是 a、b 的值。这就是所谓的参数的值传递了。

二、地址传递

void Exchg2(int *px, int *py) 
{ 
	int tmp = *px; 
	*px = *py; 
	*py = tmp; 
	printf("*px = %d, *py = %d.\n", *px, *py); 
} 
int main() 
{ 
	int a = 4; 
	int b = 6; 
	Exchg2(&a, &b); 
	printf("a = %d, b = %d.\n”, a, b); 
	return(0); 
} 

输出:

 *px = 6, *py = 4. 
 a = 6, b = 4. 

理解:
指针 px、py的值已经分别是 a、b 变量的地址值了。接下来,对*px、*py 的操作当然也就是对 a、b 变量本身的操作了。
所以函数里头的交换就是对 a、b 值的交换了,这就是所谓的地址传递(传递 a、b 的地址给了px、py)

三、引用传递
eg:

void Exchg3(int &x, int &y) /* 注意定义处的形式参数的格式与值传递不同 */ 
{ 
	int tmp = x; 
	x = y; 
	y = tmp; 
	printf("x = %d, y = %d.\n", x, y); 
} 
int main() 
{ 
	 int a = 4; 
	 int b = 6; 
	 Exchg3(a, b); /*注意:这里调用方式与值传递一样*/ 
	 printf("a = %d, b = %d.\n”, a, b); 
} 

输出:
输出结果:

x = 6, y = 4. 
a = 6, b = 4. /*这个输出结果与值传递不同。*/ 

理解:
我们先看 Exchg3 函数的定义处 Exchg3(int &x, int &y)。参数 x、 y 是 int的变量,调用时我们可以像值传递(如: Exchg1(a, b); )
一样调用函数(如: Exchg3(a, b);)。但是 x、y 前都有一个取地址符号“&”。有了这个,调用 Exchg3 时函数会将 a、b 分别代替
了 x、y 了,我们称:x、y分别引用了 a、b变量。这样函数里头操作的其实就是实参 a、b 本身了,也就是说函数里是可以直接修改
到 a、b 的值了。

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值