C 语言 引用方式调用函数
通过引用传递方式,形参为指向实参地址的指针。因为传递的是变量的地址,当对形参的指向操作时,就相当于对实参本身进行的操作
传递指针可以让多个函数访问指针所引用的对象,而不用把对象声明为全局可访问。
我们来定义一个 swap
函数, 采用引用方式传递参数
/** * swap 函数用来交换两个变量的值 */ void swap(int* a, int* b) { int temp; printf("在 swap 中,交换前的变量为 a=%2d, b=%2d\n", *a, *b ); temp = *a; /* 保存 a 的值 */ *a = *b; /* 把 b 赋值给 a */ *b = temp; /* 把 temp 赋值给 a */ printf("在 swap 中,交换后的变量为 a=%2d, b=%2d\n", *a, *b ); return; }
如果你想要了解 C 中指针的更多细节,请访问 C 语言 - 指针 章节
接下来,我们通过 引用传值 来调用函数 swap()
/** * file: main.c * author: 简单教程(www.twle.cn) */ #include <stdio.h> /* swap 函数声明 */ void swap(int* x, int* y); int main () { //定义两个整形变量 a, b /* 局部变量定义 */ int a = 7; int b = 17; printf("交换前的变量为 a=%2d, b=%2d\n", a, b); /* 调用函数来交换值 */ swap(&a, &b); printf("交换后的变量为 a=%2d, b=%2d\n", a, b); return 0; }
完整代码如下
/** * file: main.c * author: 简单教程(www.twle.cn) */ #include <stdio.h> /* swap 函数声明 */ void swap(int* x, int* y); int main () { //定义两个整形变量 a, b /* 局部变量定义 */ int a = 7; int b = 17; printf("交换前的变量为 a=%2d, b=%2d\n", a, b); /* 调用函数来交换值 */ swap(&a, &b); printf("交换后的变量为 a=%2d, b=%2d\n", a, b); return 0; } /** * swap 函数用来交换两个变量的值 */ void swap(int* a, int* b) { int temp; printf("在 swap 中,交换前的变量为 a=%2d, b=%2d\n", *a, *b ); temp = *a; /* 保存 a 的值 */ *a = *b; /* 把 b 赋值给 a */ *b = temp; /* 把 temp 赋值给 a */ printf("在 swap 中,交换后的变量为 a=%2d, b=%2d\n", *a, *b ); return; }
编译和运行上面的范例,输出结果如下
$ gcc main.c && a.out 交换前的变量为 a= 7, b=17 在 swap 中,交换前的变量为 a= 7, b=17 在 swap 中,交换后的变量为 a=17, b= 7 交换后的变量为 a=17, b= 7
我们看到,与传值调用不同,引用调用在函数内改变了 a 和 b 的值,实际上也改变了函数外 a 和 b 的值。