1. 主页
  2. 文档
  3. C语言教程
  4. C语言函数
  5. C/C++ 中的参数传递技术

C/C++ 中的参数传递技术

参数数据可以通过不同的方式传入和传出方法和函数。让我们假设一个函数B()是从另一个函数A()调用的。在这种情况下,A被称为“调用函数”B被称为“被调用函数”。此外,A发送给B的参数称为实际参数,而B的参数称为形式参数

术语

  • 形式参数:出现在函数或方法原型中的变量及其类型。
  • 实际参数:调用环境中的函数或方法调用中出现的形式参数对应的变量或表达式。
  • 模式:
    • IN:将信息从调用者传递给被调用者。
    • OUT:被调用者在调用者中写入值。
    • IN/OUT:调用者告诉被调用者变量的值,该变量可能被被调用者更新。

参数传递的重要方法

按值传递:此方法使用模式内语义。对形式参数所做的更改不会传回给调用者。任何对被调用函数或方法内部形参变量的修改只影响单独的存储位置,不会反映在调用环境中的实参中。此方法也称为按值调用

// C program to illustrate
// call by value
#include <stdio.h>

void func(int a, int b)
{
a += b;
printf("In func, a = %d b = %d\n", a, b);
}
int main(void)
{
int x = 5, y = 7;

// Passing parameters
func(x, y);
printf("In main, x = %d y = %d\n", x, y);
return 0;
}

输出:

In func, a = 12 b = 7
In main, x = 5 y = 7
  1. C、C++、Java 等语言支持这种类型的参数传递。Java 实际上是严格按值调用的。
    缺点:

    • 存储分配效率低下
    • 对于对象和数组,复制语义代价高昂
  2. 通过引用传递(别名):此技术使用输入/输出模式语义。对形式参数所做的更改确实会通过参数传递传回给调用者。对形式参数的任何更改都会反映在调用环境中的实际参数中,因为形式参数接收到对实际数据的引用(或指针)。此方法也称为引用调用。这种方法在时间和空间上都是有效的。

// C program to illustrate
// call by reference
#include <stdio.h>

void swapnum(int* i, int* j)
{
int temp = *i;
*i = *j;
*j = temp;
}

int main(void)
{
int a = 10, b = 20;

// passing parameters
swapnum(&a, &b);

printf("a is %d and b is %d\n", a, b);
return 0;
}

输出: 

a is 20 and b is 10
  1. C 和 C++ 都支持按值调用和按引用调用,而 Java 不支持按引用调用。 
    缺点:

    • 可能会发生许多潜在的情况
    • 程序有时难以理解

其他参数传递方法

这些技术较老,并在早期的编程语言中使用,如 Pascal、Algol 和 Fortran。这些技术不适用于高级语言。 

  1. Pass by Result :此方法使用out-mode语义。就在控制权传回给调用者之前,形参的值被传回给实参。他的方法有时被称为call by result。通常,通过结果技术是通过复制来实现的。 
  2. 按值结果传递:此方法使用输入/输出模式语义。它是传递值和传递结果的组合。就在控制权被传回调用者之前,形参的值被传回给实参。此方法有时称为按值结果调用
  3. 按名称传递:这种技术用于编程语言,例如Algol。在这种技术中,变量的符号“名称”被传递,这使得它既可以被访问也可以更新。 
    示例: 
    要将C[j]的值加倍,您可以将其名称(而不是其值)传递给以下过程。 
procedure double(x);
real x;
begin 
x:=x*2
end;
  1. 通常,按名称传递的效果是以文本方式将过程调用中的参数替换为过程主体中的相应参数。 
    Pass-by-Name 机制的含义: 

    • 每次传递形式参数时,都会重新计算参数表达式。
    • 该过程可以更改参数表达式中使用的变量的值,从而更改表达式的值。
这篇文章对您有用吗?