C语言 一个例子弄懂传值调用和传址调用

故名思意传值调用和传址调用的区别,传值是把实参的值赋值给形参,那么对形参的修改是不会影响实参的值的。传址是一种特殊的方式,它传递的是地址,让形参和实参同时指向一块内存区域,形参的变动也会影响实参。

我们举个简单的例子吧,也就是我们最熟悉的交换两个变量的值。

int main()
{
	int a = 10;
	int b = 20;

	swap(a, b);

	printf("%d %d", a, b);

	return 0;
}

基础代码我们写出来了,现在要写函数部分,我们分别展示传值和传址的使用区别和结果差异

传值调用:

//传值调用
void swap(int x, int y)
{
	int tmp = 0;
	tmp = x;
	x = y;
	y = tmp;
}

int main()
{
	int a = 10;
	int b = 20;

	swap(a, b);

	printf("%d %d", a, b);

	return 0;
}

 很显然答案并不是我们期望的,它并没有帮我们交换,交换前和交换后结果一样。

我们打开监视窗口来看看到底发生了什么

监视告诉我们形参xy和实参ab各有各的地址。虽然x和y确实交换了,但x和y是形参,并不会影响a和b,所以a和b没有任何变化。

传址调用:

//传址调用
void swap(int* pa, int* pb)
{
	int tmp = 0;
	tmp = *pa;
	*pa = *pb;
	*pb = tmp;
}

int main()
{
	int a = 10;
	int b = 20;

	swap(&a, &b);

	printf("%d %d", a, b);

	return 0;
}

交换成功,复合预期结果。那这段代码里面具体发生了什么呢

 形参和实参都指向的是同一块内存空间的内容,被调函数和主调函数之间就产生了联系。

所以在以后需要在函数内部直接修改主调函数的变量时就要通过传址调用的方式

### 值调用调用的区别 在编程语言中,函数调用时参数的递方式主要分为值调用(Call by Value)调用(Call by Reference)。这两种方式的核心区别在于实参形参之间的数据交互方式。 #### 1. 值调用(Call by Value) 值调用是指当一个函数被调用时,实参的值会被复制并递给形参。这意味着形参是实参的一个副本,函数内部对形参的任何修改都不会影响到实参[^3]。 例如,在C语言中: ```c void Swap(int x, int y) { int tmp = x; x = y; y = tmp; } int main() { int a = 10; int b = 20; printf("Before: a=%d, b=%d\n", a, b); Swap(a, b); printf("After: a=%d, b=%d\n", a, b); return 0; } ``` 上述代码中,`Swap` 函数中的 `x` `y` 是 `a` `b` 的副本,因此即使在函数内部交换了 `x` `y`,`a` `b` 的值不会受到影响[^2]。 #### 2. 调用(Call by Reference) 调用是指将实参的地递给形参,形参实际上是一个指向实参的指针。函数内部通过指针操作可以直接修改实参的值。因此,函数内部对形参的修改会直接影响到实参[^5]。 例如: ```c void swap(int *pa, int *pb) { int z = 0; z = *pa; *pa = *pb; *pb = z; } int main() { int a = 10; int b = 20; printf("交换前:a=%d b=%d\n", a, b); swap(&a, &b); printf("交换后:a=%d b=%d\n", a, b); return 0; } ``` 在此代码中,`swap` 函数通过指针直接修改了 `a` `b` 的值,因此在函数调用后,`a` `b` 的值发生了变化[^5]。 ### 判断方法 - **观察参数类型**:如果函数的参数是基本数据类型(如 `int`、`float`),通常是值调用;如果参数是指针或引用类型(如 `int*` 或 `int&`),则可能是调用。 - **检查函数内部操作**:如果函数内部的操作能够影响到实参的值,则为调用;否则为值调用。 - **测试程序行为**:编写简单的测试程序,观察函数调用前后实参的值是否发生变化。如果发生变化,则为调用;否则为值调用。 ### 总结 值调用调用的主要区别在于数据递的方式以及对实参的影响。值调用通过复制实参的值进行操作,不影响实参;而调用通过递实参的地进行操作,可以直接修改实参的值[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值