传值,传址和引用传递的区别

本文通过几个C++函数示例介绍了值传递、指针传递及引用传递的区别。值传递仅修改局部变量,指针传递能直接改变实参所指向的内容,而引用传递则以实参为别名进行操作,效率最高。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先贴一段代码,

void swap_zhi(int v1,int v2)
{
 int temp=v1;
 v1=v2;
 v2=temp;
}

void swap(int *p1,int *p2)
{
 int temp=*p1;
 *p1=*p2;
 *p2=temp;
}

void swap1(int *p1,int *p2)
{
 int *p;
 p=p1;
 p1=p2;
 p2=p;
}

void swap_ref(int &p1,int &p2)
{
 int temp;
 temp=p1;
 p1=p2;
 p2=temp;
}

void main(0

{
    int a1=10;
    int b1=20;
    int *p_1=&a1;
    int *p_2=&b1;
   //swap(p_1,p_2);

   //swap1(p_1,p_2);

   swap_ref(a1,b1);
}

上面,swap_zhi是典型的传值函数,swap和swap1分别是传址函数,和传址函数的对比函数,swap_ref是引用传递函数。

传值函数执行时,实参的值不会变换,只有形参会发生改变。

传址函数执行时,实参的地址不会变,形参的地址改变;但是实参的指向会发生变化,可以实现数据的顺序更改。

引用传递函数执行时,实参和形参都会改变,原因则是由于形参此时只是实参的一个引用,只是一个别名,没有复制的过程,所以引用用来做形参传递参数是效率最高的。

 

调用调用是程序设计语言中函数或过程调用时传递参数的两种基本机制。 ### 调用(Call by Value) 在这种调用方式下,实际参数的具体会复制给形参。这意味着,在被调用的过程中对形参所做的任何修改都不会影响到实参本身。它通常用于需要保护原始数据不变的情况下,确保外部环境的数据安全性与稳定性。 **特点:** - 参数传递的是变量的一份拷贝; - 函数内部的操作不会改变原变量的状态; - 更加安全可靠,因为不存在副作用; ```python # Python 示例 (Python 中所有不可变类型都是按传递) def modify(x): x = 10 a = 5 modify(a) print(a) # 输出仍为5,不受函数内操作的影响 ``` ### 调用(Call by Reference 或 Call by Address) 而则是将实际参数内存位置的信息提供给了形式参数,使得两者共享相同的存储空间。因此如果在过程中改变了形参的内容,则相应的结果同样会在实参上体现出来。这种方式可以节省时间空间开销,并允许返回多个计算结果等优点。 **注意:** 某些高级语言如 C++、C#, Java 支持直接引用类型的传递, 其他像 Python 则是以对象引用的方式间接实现了类似的效果. **特点:** - 直接作用于原有数据; - 可能会影响原来的变量内容; - 提高效率并简化某些算法; ```cpp // C++ 示例 void swap(int &x , int &y){ int temp=x; x=y; y=temp; } int main(){ int a=4,b=6; cout << "交换前:" << endl; cout<<"a="<<a<<", b="<<b<<endl; swap(a,b); cout<<"\n交换后:"<<endl; cout <<"a=" <<a<< ", b="<<b ; } /* 运行以上代码将会打印出: 交换前: a=4, b=6 交换后: a=6, b=4 */ ``` 这两种调用模式各有优劣,开发者应当根据具体情况选择合适的策略来编写高效可靠的软件系统。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值