传值和传址

本文探讨了编程中传值和传址的概念及其差异,详细分析了不同数据类型(如数字、布尔、字符串和对象)在操作过程中的具体表现,并以JavaScript为例进行说明。

对操作数据的传值和传址讨论是具有一般意义的,而二者的区别适用于所有的编程语言。

 

一:传值                                                                                         

1.复制:实际复制的是值,存在两个不同的,独立的拷贝  。

2.传递:传递给函数的是值的一个独立的拷贝,对它的改变在函数外部没有影响。

3.比较:比较的是两个独立的值(通常逐字节比较),以判断他们是否相等。

 

二:传址

1.复制:复制的只是对数值的引用。如果通过这个新的引用修改了数值,这个改变对最初的引用来说也可见。

2.传递:传递给函数的是对数值的一个引用。如果函数通过传递给它的应用修改了数值,这个改变在函数外部也可见。

3.比较:比较的是两个引用,以判断它们引用的是否是同一个数值。对两个不同的数值的引用不相等,即使这两个数值是由相同的子节构成的。

 

JavaScript的基本规则是:基本数据类型通过传值来操作,而引用类型,从其名字可以看出,通过传址来操作。数字和布尔类型在JavaScript中都是基本类型。因为他们只是有一些很小的、固定数目的字节组成,这些字节很容易在JavaScript解释器的较低层操作。另一方面,对象是引用类型,数组和函数,是对象的特殊类型,也是引用类型。这些数据类型可以包含任意数目的属性和元素,因此他们无法向固定大小的基本类型值那样很容易的操作。既然对象和数值的值可能会变得很大,那么通过传址来操作这些类型也就没有什么意义,因为这样可能会牵涉到对大量内存低效率的复制和比较。

在C++和Java中,字符串是引用类型,是通过传址来比较的。JavaScript是一种高级语言,并且认为比较字符串的时候,通过传值来比较它们。

总结:

类型      复制     传递     比较

数字      传值     传值     传值

布尔      传值     传值     传值

字符串   不可变  不可变  传值

对象      传值     传值     传值

 

指的是在函数调用时入参数的而非地,若函数内部对参数重新赋,函数外的全局变量不会相应改变[^1]。以下是不同编程语言解决问题的方法: ### C/C++语言 在C/C++中,可通过指针或引用的方式解决问题。 #### 使用指针 ```c #include <stdio.h> void modifyValue(int *param) { *param = *param + 1; } int main() { int x = 3; modifyValue(&x); printf("%d\n", x); // 输出4 return 0; } ``` #### 使用引用 ```cpp #include <iostream> void modifyValue(int &param) { param = param + 1; } int main() { int x = 3; modifyValue(x); std::cout << x << std::endl; // 输出4 return 0; } ``` ### Python语言 Python的根据入参数的类型选择,若函数收到可变对象(如字典或列表)的引用,就能修改对象的原始;若收到不可变对象(如数字、字符或元组)的引用,就不能直接修改原始对象[^2]。对于不可变对象,可通过返回的方式更新外部变量。 ```python def modifyValue(num): return num + 1 x = 3 x = modifyValue(x) print(x) # 输出4 ``` 对于可变对象,可直接在函数内部修改。 ```python def modifyList(lst): lst.append(4) myList = [1, 2, 3] modifyList(myList) print(myList) # 输出[1, 2, 3, 4] ``` ### JavaScript语言 对于基本数据类型,不同变量之间互不干扰;对于引用数据类型,可修改原始对象。若要修改基本数据类型,可通过返回更新外部变量。 ```javascript function modifyValue(num) { return num + 1; } let x = 3; x = modifyValue(x); console.log(x); // 输出4 let arr = [1, 2, 3]; function modifyArray(arr) { arr.push(4); } modifyArray(arr); console.log(arr); // 输出[1, 2, 3, 4] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值