参数数据可以通过不同的方法传入和传出方法和函数。让我们假设从另一个函数A()调用了函数B () 。在这种情况下, A被称为“呼叫者函数”,而B被称为“被呼叫函数或被调用者函数” 。同样, A发送给B的参数称为实际参数,而B的参数称为形式参数。
术语
- 形式参数:在函数或方法的原型中出现的变量及其类型。
- 实际参数:与在调用环境中的函数或方法调用中出现的形式参数相对应的变量或表达式。
- 模式:
- IN:将信息从呼叫者传递到被叫者。
- OUT:被叫方将值写入调用方。
- 输入/输出:呼叫者告诉被呼叫者变量的值,该值可以由被呼叫者更新。
参数传递的重要方法
- 按值传递:此方法使用模式内语义。对形式参数所做的更改不会传输回调用方。对被调用函数或方法内部的形式参数变量的任何修改仅影响单独的存储位置,并且不会反映在调用环境中的实际参数中。此方法也称为按值调用。
// C program to illustrate // call by value #include
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
诸如C,C++, Java之类的语言都支持这种类型的参数传递。实际上, Java严格按值调用。
缺点:- 存储分配效率低下
- 对于对象和数组,复制语义是昂贵的
- 通过引用传递(别名):此技术使用输入/输出模式语义。对形式参数所做的更改确实会通过参数传递回传给调用者。形式参数的任何更改都会反映在调用环境中的实际参数中,因为形式参数会收到对实际数据的引用(或指针)。此方法也称为“按引用调用” 。该方法在时间和空间上都是有效的。
// C program to illustrate // call by reference #include
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
C和C++都支持按值调用以及按引用调用,而Java不支持按引用调用。
缺点:- 可能发生许多潜在的情况
- 程序有时很难理解
参数传递的其他方法
这些技术较旧,并已在Pascal,Algol和Fortran等较早的编程语言中使用。这些技术不适用于高级语言。
- 按结果传递:此方法使用输出模式语义。就在将控制权转移回调用者之前,形式参数的值会被传输回实际参数。有时,他的方法称为按结果调用。通常,按结果传递技术是通过复制实现的。
- 按值传递结果:此方法使用输入/输出模式语义。它是“按值传递”和“按结果传递”的组合。就在将控制权转移回调用者之前,形式参数的值将被传输回实际参数。有时将此方法称为按值结果调用
- 按名称传递:此技术用在Algol等编程语言中。在这种技术中,传递了变量的符号“名称”,这使得变量可以被访问和更新。
例子:
要使C [j]的值加倍,可以将其名称(而不是其值)传递给以下过程。procedure double(x); real x; begin x:=x*2 end;
通常,“按名称传递”的作用是在文本上将过程调用中的参数替换为过程主体中的相应参数。
名称传递机制的含义:- 每次传递形式参数时,都会重新评估参数表达式。
- 该过程可以更改在参数表达式中使用的变量的值,从而更改表达式的值。
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。