编程语言参数传递方式
以C++、Java、Python、JavaScript语言为例,介绍编程语言参数传递方式
★C++中参数传递方式:
按值传递(Pass by Value):这是C++函数参数的默认传递方式。在这种情况下,函数接收的是参数值的一个副本,而不是参数本身——实参的值会被复制到形参中。因此,函数内对参数的任何修改都不会影响原始参数。
按引用传递(Pass by Reference):在C++中,可以通过引用来传递参数。这种情况下,函数接收的是参数的引用,而不是值的副本。这意味着函数内对参数的任何修改都会影响到原始参数。在C语言中,没有按引用传递,但可以通过指针实现类似的效果。
按指针传递(Pass by Pointer): C++中,可以通过指针来传递参数。在这种情况下,函数接收的是指向参数的指针。函数内可以通过该指针修改原始参数的值。
示例:
#include <iostream>
using namespace std;
void passByValue(int num) {
num = 10; // 修改形参的值
}
void passByReference(int& num) {
num = 10; // 修改原始参数的值
}
int main() {
int num1 = 5;
int num2 = 5;
passByValue(num1);
cout << "After passByValue, num1 = " << num1 << endl; // 输出 5
passByReference(num2);
cout << "After passByReference, num2 = " << num2 << endl; // 输出 10
return 0;
}
在 Java、Python 和 JavaScript 等编程语言中,参数传递方式都是按值传递,即传递的是参数的副本。
★Java参数传递方式:
Java 中的参数传递方式只有按值传递。无论是基本数据类型还是引用类型,都是按值传递。 1)对于基本数据类型(如整数、浮点数、布尔值等),函数接收的是该值的副本,方法(函数)内部对副本的修改不会影响到原始的值。 2)对于引用类型(如对象、数组等),函数接收的是对象引用的副本,也就是地址的副本。这意味着方法(函数)内部对引用的修改会影响到原始的对象。
示例:
public class demoA {
public static void passByValue(int num) {
num = 10; // 修改形参的值
}
public static void passByReference(int[] arr) {
arr[0] = 10; // 修改原始参数的值
}
public static void main(String[] args) {
int num1 = 5;
int[] arr = {5};
passByValue(num1);
System.out.println("After passByValue, num1 = " + num1); // 输出 5
passByReference(arr);
System.out.println("After passByReference, arr[0] = " + arr[0]); // 输出 10
}
}
★Python参数传递方式:
实际上 Python 中的参数传递方式是统一的,都是按照值传递进行的,传递的是参数的副本。在python中,参数传递方式是按值传递——传递的是副本。1)当将一个基本数据类型(如整数、浮点数、布尔值等)作为参数传递给函数时,实际上是将该值的一个副本传递给函数。函数内部对该副本的修改不会影响到原始的值。2)当将一个引用类型(如列表、字典等)作为参数传递给函数时,传递的是该对象的引用(地址)的副本。这意味着函数内部对该引用的修改将会影响到原始的对象。
示例:
def pass_by_value(num):
num = 10 # 修改形参的值
def pass_by_reference(arr):
arr[0] = 10 # 修改原始参数的值
num1 = 5
arr = [5]
pass_by_value(num1)
print("After pass_by_value, num1 =", num1) # 输出 5
pass_by_reference(arr)
print("After pass_by_reference, arr[0] =", arr[0]) # 输出 10
★JavaScript参数传递方式及特点:
在 JavaScript中,参数传递方式是按值传递——传递的是副本。1)当将一个值类型(如数字、字符串、布尔值等)作为参数传递给函数时,实际上是将该值的一个副本传递给函数。函数内部对该副本的修改不会影响到原始的值。2)当将一个引用类型(如对象、数组等)作为参数传递给函数时,传递的是该对象的引用(地址)的副本。这意味着函数内部对该引用的修改将会影响到原始的对象,这可能会产生一种错觉,让人误以为 JavaScript 是按引用传递的。
示例
function passByValue(num) {
num = 10; // 修改形参的值
}
function passByReference(obj) {
obj.name = "John"; // 修改原始参数的属性值
}
let num1 = 5;
let obj = { name: "Alice" };
passByValue(num1);
console.log("After passByValue, num1 =", num1); // 输出 5
passByReference(obj);
console.log("After passByReference, obj.name =", obj.name); // 输出 "John"
OK!