C语言值传递函数调用



在C语言中,一个函数可以从任何其他函数(包括自身)调用。函数调用有两种方式:(a)值传递和(b)引用传递。默认情况下,使用值传递机制。

形式参数和实际参数

您必须了解这些术语才能理解值传递方法的工作原理:

形式参数 - 函数需要某些数据来执行其所需的过程。定义函数时,假设数据值将以参数或参数列表的形式提供,该列表位于函数名前面的括号内。这些参数是某种数据类型的变量。

实际参数 - 当要调用某个函数时,应为其提供相同类型且顺序相同的所需数量的值,就像在其定义中使用的那样。

看看下面的代码片段:

type function_name(type var1, type var2, ...)

这里,参数变量称为形式参数。在函数的作用域内,这些变量充当其局部变量

考虑以下函数:

int add(int x, int y){

   int z = x + y;

   return z;

}

此函数定义中的参数xy是形式参数。

示例:C语言中的值传递

如果调用add()函数,如下面的代码所示,则括号内的变量(ab)是实际参数。它们被传递给函数。

请看下面的例子:

#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()函数中的变量abc分别占据内存位置100、200和300。当用ab作为实际参数调用add()函数时,它们的值分别存储在xy中。

Random Memory Address

变量xyz是add()函数的局部变量。在内存中,它们将被分配一些随机位置。让我们假设它们分别在内存地址1000、2000和3000中创建。

由于函数是通过将实际参数的值复制到其对应的形式参数变量来调用的,因此xy的地址(分别是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语言引用传递机制的详细解释。

引用传递方法涉及传递保存实际参数值的变量的地址。您可以设计一种调用方法,该方法是值传递和引用传递的混合。在这种情况下,某些参数按值传递,而其他参数按引用传递。

广告