C++ 传值传址

本文探讨了C++中的传值和传址概念,通过代码示例展示了传值如何创建参数副本而不影响原变量,而传址则是通过引用或指针直接操作原变量。指针的传值可能导致指针本身的复制,但不改变原始指针的指向,而在函数中直接修改指针变量的值则会影响原指针。

C++的传值传址

先来看一段代码:

void fa(int &a,int &b)
{
      int t=a;a=b;b=t;
}
void fb(int a,int b)
{
      int t=a;a=b;b=t;
}
void fc(int *a,int *b)
{
      int *t=a;a=b;b=t;
}
void fd(int *a,int *b)
{
      int *t=a;*a=*b;*b=*t;
}
void main()
{
    int c[2]={100,200};
    fa(c[0],c[1]);
    cout<<c[0]<<'\t'<<c[1]<<endl;
    fb(c[0],c[1]);
    cout<<c[0]<<'\t'<<c[1]<<endl;
    fc(c[0],c[1]);
    cout<<c[0]<<'\t'<<c[1]<<endl;
     fd(c[0],c[1]);
    cout<<c[0]<<'\t'<<c[1]<<endl;
}

输出结果:

200  100
100  200
100  200
200  100

原因探讨
1.第一个是引用,所以a,b是传入参数的别名,所以修改a,b就是修改原参数;
2.第二个是正常的传值,相当于原参数的复制品去完成函数操作,所以对原参数的值不会产生任何影响;
3.是指针的传值。相当于把原指针的值的复制品去完成函数操作,所以复制品完成了指向的交换并不影响原指针的值;
4.也是指针的传值,但是在函数中访问了原指针并修改了其数值。

### 软考中调用与调用的区别及应用场景 #### 一、基本概念 在编程领域,函数参数递主要分为两种方式:调用(Call by Value)和调用(Call by Reference)。这两种方法决定了函数内部对变量的操作是否会直接影响外部的实际数据。 - **调用**指的是将实际参数的副本递给形参,在函数体内操作的是这个副本而非原始数据。因此,即使修改了形参的,也不会影响到实参本身[^1]。 - **调用**则是将实际参数的内存地递给形参,这样函数体内的任何改变都会作用于该地指向的数据上,从而可能永久性地更改原数据。 #### 二、具体区别 | 特性 | 调用 (Call By Value) | 调用 (Call By Reference) | |-------------------|------------------------------------------|----------------------------------------| | 数据递方式 | 将实参的复制一份交给形参 | 把实参所在存储位置的指针赋给形参 | | 影响范围 | 只能在当前函数内有效 | 修改会影响到整个程序中的对应对象 | | 性能消耗 | 需要额外空间来保存临时拷贝 | 不需创建新实例, 更节省资源但需要注意副作用 | #### 三、应用场景举例 ##### 1. 使用场景 - 调用 当只需要利用输入数做一些计算或者处理而不需要对其做持久性的变更时适合采用此法。比如下面这段Python代码展示了如何通过实现简单的加法功能: ```python def add_one(x): x += 1 return x original_value = 5 new_value = add_one(original_value) print(f"Original value is {original_value}") # Original value remains unchanged as it was passed by value. ``` 上述例子中`add_one()`接收了一个整型作为它的唯一参数并对其进行增加操作后再返回新的结果。由于这里采取了策略所以尽管进行了更新动作却不会波及源头上的那个数字。 ##### 2. 使用场景 - 调用 如果希望某个特定部分能够直接操控另一个地方存在的实体,则应该考虑运用引用机制。C++语言提供了非常直观的例子说明这一点: ```cpp void swap(int &a, int &b){ int temp; temp=a; /* save the value at address a */ a=b; /* put b into what used to be a's place*/ b=temp; /* assign old 'a' back over where b originally pointed */ } int main(){ int first=10 , second=20 ; cout << "Before swapping:\nFirst number=" <<first<< "\tSecond Number="<<second<<"\n"; swap(first,second); cout << "After Swapping :\nFirst number=" <<first<< "\tSecond Number="<<second<<"\n"; return 0; } ``` 在这个案例里我们定义了一个名为swap()的方法用于交换两个整数的位置关系。因为采用了按引用的方式来进行交互故而在main()函数里的初始状态发生了实质的变化. #### 四、注意事项 虽然两者各有千秋但在选用过程中也存在一些潜在的风险因素得注意: 对于大型结构体或类的对象而言频繁地进行深拷贝可能会带来较大的开销所以在这种情况下更倾向于选择后者减少不必要的负担同时也要警惕不当使用可能导致不可预见的结果如循环依赖等问题的发生. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值