在将参数传递给函数的编程中,我们将函数调用分为两种:按值调用和按引用调用。正如两次调用中所建议的那样,我们按参数类型调用函数,即传递参数的实际值,在其他情况下,我们传递参数的位置/引用。
以下是“按值调用”和“按引用调用”之间的重要区别。
序号 | 键 | 按值致电 | 通过参考电话 |
---|---|---|---|
1 | 命名约定 | 与这种类型一样,参数的值将传递给函数调用,因此将其命名为“按值调用”。 | 另一方面,在此类型中,参数的引用被传递以调用该函数,因此将其命名为“按引用调用”。 |
2 | 内部实施 | 在“按值调用”中,我们在调用函数期间传递的参数值将被复制到函数的实际局部参数中。 | 在“按引用调用”中,将复制传递参数的位置地址/引用,并将其分配给函数的本地参数,因此传递参数和实际参数都指向同一位置。 |
3 | 变化的影响 | 由于将传递的参数的值复制到函数的参数,因此函数内部的参数所做的任何更改都不会反映在传递的参数中。 | 由于参数和传递的参数都指向同一位置,因此对函数内部参数所做的任何更改都会反映在传递的参数中。 |
4 | 引用的内存位置 | 传递的参数和函数的实际参数所引用的内存位置是不同的。 | 传递的参数和函数的实际参数所引用的内存位置相同。 |
5 | 支持的语言。 | 值调用由以下语言支持:C ++。PHP。Visual Basic NET和C#。 | JAVA主要支持按引用调用。 |
ByValue.c
#include <stdio.h> class ByValue{ void swapByValue(int, int); /* Prototype */ int main(){ int n1 = 10, n2 = 20; swapByValue(n1, n2); printf("n1: %d, n2: %d\n", n1, n2); } void swapByValue(int a, int b){ int t; t = a; a = b; b = t; } }
输出结果
n1: 10, n2: 20
ByReference.c
#include <stdio.h> class ByReference{ void swapByReference(int*, int*); int main(){ int n1 = 10, n2 = 20; swapByReference(&n1, &n2); printf("n1: %d, n2: %d\n", n1, n2); } void swapByReference(int *a, int *b){ int t; t = *a; *a = *b; *b = t; } }
输出结果
n1: 20, n2: 10