函数参数的两种传递方式
如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。
形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。 当调用函数时,有两种向函数传递参数的方式:
一、传值调用
该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。 默认情况下,C 语言使用传值调用方法来传递参数。一般来说,这意味着函数内的代码不会改变用于调用函数的实际参数。 函数 swap() 定义如下:
/* 函数定义 */ void swap(int x, int y) { int temp; temp = x; /* 保存 x 的值 */ x = y; /* 把 y 赋值给 x */ y = temp; /* 把 temp 赋值给 y */ return; }
现在,让我们通过传递实际参数来调用函数 swap():
#include <stdio.h> /* 函数声明 */ void swap(int x, int y); int main () { /* 局部变量定义 */ int a = 100; int b = 200; printf("交换前,a 的值: %d ", a ); printf("交换前,b 的值: %d ", b ); /* 调用函数来交换值 */ swap(a, b); printf("交换后,a 的值: %d ", a ); printf("交换后,b 的值: %d ", b ); return 0; }
当上面的代码被编译和执行时,它会产生下列结果:
交换前,a 的值: 100 交换前,b 的值: 200 交换后,a 的值: 100 交换后,b 的值: 200
上面的实例表明了,虽然在函数内改变了 a 和 b 的值,但是实际上 a 和 b 的值没有发生变化。
二、引用调用
通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。 传递指针可以让多个函数访问指针所引用的对象,而不用把对象声明为全局可访问。 还是以上述代码为例:
/* 函数定义 */ void swap(int *x, int *y) { int temp; temp = *x; /* 保存地址 x 的值 */ *x = *y; /* 把 y 赋值给 x */ *y = temp; /* 把 temp 赋值给 y */ return; }
现在,让我们通过引用传值来调用函数 swap():
#include <stdio.h> /* 函数声明 */ void swap(int *x, int *y); int main () { /* 局部变量定义 */ int a = 100; int b = 200; printf("交换前,a 的值: %d ", a ); printf("交换前,b 的值: %d ", b ); /* 调用函数来交换值 * &a 表示指向 a 的指针,即变量 a 的地址 * &b 表示指向 b 的指针,即变量 b 的地址 */ swap(&a, &b); printf("交换后,a 的值: %d ", a ); printf("交换后,b 的值: %d ", b ); return 0; }
当上面的代码被编译和执行时,它会产生下列结果:
交换前,a 的值: 100 交换前,b 的值: 200 交换后,a 的值: 200 交换后,b 的值: 100
上面的实例表明了,与传值调用不同,引用调用在函数内改变了 a 和 b 的值,实际上也改变了函数外 a 和 b 的值。
下一篇:
Java实现小型英汉互译服务器