在 C 语言中,可以从任何其他函数调用函数,包括它自己。有两种方法可以调用函数 - (a) 按值调用和 (b) 按引用调用。默认情况下,采用按值调用机制。
形式论证和实际论据
您必须了解术语才能理解按值调用方法的工作原理 -
形式参数 - 函数需要某些数据来执行其所需的过程。定义函数时,假定数据值将以参数或参数列表的形式提供在函数名称前面的括号内。这些参数是特定数据类型的变量。
实际参数 - 当要调用某个函数时,应为其提供所需数量的相同类型和与其定义中使用的相同顺序的值。
请看以下代码片段 -
type function_name(type var1, type var2, ...)
在这里,参数变量称为形式参数。在函数的作用域内,这些变量充当其局部变量。
考虑以下功能
int add(int x, int y){
int z = x + y;
return z;
}
此函数定义中的参数 x 和 y 是形式参数。
示例:C 中的值调用
如果调用 add() 函数,如下面的代码所示,则括号内的变量(a 和 b)是实际参数。它们被传递给函数。
请看下面的例子
#include <stdio.h>
int add(int x, int y){
int z = x + y;
return z;
}
int main(){
int a = 10, b = 20;
int c = add(a, b);
printf("Addition: %d", c);
}
输出
当您运行此代码时,它将产生以下输出
Addition: 30
按值调用方法意味着实际参数的值被复制到正式参数变量中。因此,“x”取“a”的值,“b”赋值“y”。add() 函数中的局部变量 “z” 存储加法值。在 main() 函数中,add() 函数返回的值被分配给 “c”,并打印出来。
请注意,C 语言中的变量是内存中的命名位置。因此,在内存中创建变量,编译器为每个变量分配一个随机内存地址。
“按值调用”在 C 语言中是如何工作的?
假设 main() 函数中的变量 a、b 和 c 分别占据内存位置 100、200 和 300。当以 a 和 b 作为实际参数调用 add() 函数时,它们的值分别存储在 x 和 y 中。
变量 x、y 和 z 是 add() 函数的局部变量。在内存中,它们将被分配一些随机位置。假设它们分别在内存地址 1000、2000 和 3000 中创建。
由于该函数是通过将实际参数的值复制到其相应的形式参数变量来调用的,因此作为 x 和 y 地址的位置 1000 和 2000 将分别容纳 10 和 20。编译器将其加法分配给返回的第三个局部变量 z。
当控件返回到 main() 函数时,返回的数据被分配给 c,它显示为程序的输出。
例
按值调用是 C 语言中默认的函数调用机制。它消除了功能的潜在副作用,使您的软件更易于维护和理解。它最适合于期望对收到的参数进行特定计算并返回结果的函数。
这是按值调用的另一个示例
#include <stdio.h>
/* function declaration */
void swap(int x, int y);
int main(){
/* local variable definition */
int a = 100;
int b = 200;
printf("Before swap, value of a: %d\n", a);
printf("Before swap, value of b: %d\n", b);
/* calling a function to swap the values */
swap(a, b);
printf("After swap, value of a: %d\n", a);
printf("After swap, value of b: %d\n", b);
return 0;
}
void swap(int x, int y){
int temp;
temp = x; /* save the value of x */
x = y; /* put y into x */
y = temp; /* put temp into y */
return;
}
输出
当您运行此代码时,它将产生以下输出 −
Before swap, value of a: 100
Before swap, value of b: 200
After swap, value of a: 100
After swap, value of b: 200
它显示值没有变化,尽管它们在函数内部已更改。
由于这些值被复制到另一个函数的不同局部变量中,因此任何操作都不会对调用函数中的实际参数变量产生任何影响。
但是,当我们需要将大型对象(如数组或文件)传递给另一个函数时,按值调用方法的效率较低。此外,在某些情况下,我们可能需要由另一个函数操作实际参数。在这种情况下,“按值调用”机制没有用。为此,我们必须探索“参考调用”机制。有关C的“引用调用”机制的详细说明,请参阅下一章。
按引用调用方法涉及传递保存实际参数值的变量的地址。您可以设计一种混合了 Call by Value 和 Call by Reference 的调用方法。在这种情况下,某些参数按值传递,而其他参数则通过引用传递。