目录
- 介绍
- 传值调用
- 传址调用
- 实例演示
- 总结
1. 介绍
在C语言中,函数可以通过参数来接受外部变量的值。然而,默认情况下,函数使用的是传值调用传递参数。这意味着函数在调用时会将参数的值复制一份给形参,并在函数内部对形参进行操作,而不会改变外部变量的值。
如果我们想要在函数内部修改外部变量的值,我们需要使用传址调用。传址调用传递的是变量的地址,函数通过该地址可以直接访问并修改外部变量的值。
本文将通过C语言的具体示例,分别讲解传值调用和传址调用的使用方法,以及在函数内部如何修改外部变量的值。
2. 传值调用
在传值调用中,函数在调用时会将参数的值复制一份给形参,函数内部对形参进行操作不会影响到外部变量的值。
示例代码:
#include <stdio.h>
void fun(int a);
int main(void)
{
int a = 2;
fun(a);
printf("%d\n", a); // 输出2
}
void fun(int a)
{
a = 3;
}
在上述示例中,我们定义了函数fun
,它接受一个int
类型的参数a
。在main
函数中,我们定义了一个变量a
并赋值为2,然后调用fun
函数,传递a
作为参数。fun
函数内部将参数a
的值修改为3。但是在main
函数中打印a
的值时,输出的结果仍然是2。这是因为在传值调用中,函数对形参的修改不会影响到外部变量。
3. 传址调用
在传址调用中,函数在调用时传递的是变量的地址,函数内部可以通过该地址直接访问并修改外部变量的值。
示例代码:
#include <stdio.h>
void fun(int* p);
int main(void)
{
int a = 2;
fun(&a);
printf("%d\n", a); // 输出3
}
void fun(int* p)
{
*p = 3;
}
在上述示例中,我们修改了函数fun
的定义,使其接受一个int
类型的指针作为参数。在main
函数中,定义了一个变量a
并赋值为2,然后调用fun
函数,传递&a
作为参数。&a
表示a
的地址,也即通过指针p来指向a的存储位置。fun
函数内部通过指针p间接访问并修改外部变量a
的值。因此,在main
函数中打印a
的值时,输出的结果是3。这就是传址调用的效果。
4. 实例演示
在这个实例中,我们将通过一个函数来交换两个变量的值。使用传值调用时,交换不会生效,但使用传址调用时,交换可以成功。
示例代码:
#include <stdio.h>
void swap(int a, int b);
void real_swap(int* p, int* q);
int main(void)
{
int x = 3;
int y = 5;
printf("Before swap: x = %d, y = %d\n", x, y);
swap(x, y);
printf("After swap using pass by value: x = %d, y = %d\n", x, y); // 输出为3,5
real_swap(&x, &y);
printf("After swap using pass by reference: x = %d, y = %d\n", x, y); // 输出为5,3
return 0;
}
void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
void real_swap(int* p, int* q)
{
int temp = *p;
*p = *q;
*q = temp;
}
在上述示例中,我们定义了两个交换函数swap
和real_swap
。swap
函数中,我们尝试通过传值调用交换两个变量的值,但这并不起作用。而在real_swap
函数中,我们使用了传址调用,通过指针实现了变量值的交换。在main
函数中,我们分别调用了这两个函数,并打印了交换结果。可以看到,只有使用传址调用时,才能成功交换变量的值。
5. 总结
本文介绍了C语言中如何通过函数参数修改外部变量的值。传值调用只是对参数值进行复制,在函数内部的修改不会影响到外部变量。而传址调用通过传递变量的地址,在函数内部可以直接修改外部变量的值。通过对示例代码的分析,我们了解了传值调用和传址调用的使用方法,并进行了实际的演示。
通过理解和掌握传址调用的使用方法,我们可以更好地在函数中修改外部变量的值,享受到C语言灵活性和强大的操作能力。