C++的三种传参方式

C++中的3三种传值方式。
1、按值传递。
按值传递是最常见的。但是因为相同的值但却可以是不同的内存,这就导致了 我们参数,有时不一定能传到我们要的函数体内。
#include<iostream>
using namespace std;
void swap(int a,int b){
cout<<"swap函数 交换前"<<"a="<<a<<"b="<<b<<endl;
int temp;
temp=a;
a=b;
b=temp;
cout<<"swap函数 交换后"<<"a="<<a<<"b="<<b<<endl;
}
int main(){
int a=3;
int b=4;
cout<<"main函数内 交换前"<<"a="<<a<<"b="<<b<<endl;
swap(a,b);
cout<<"main函数内 交换后"<<"a="<<a<<"b="<<b<<endl;
return 0;
}
-------------------------------------------------------------------------------------------------------------------
运行结果:
main函数内 交换前a=3b=4
swap函数 交换前a=3b=4
swap函数 交换后a=4b=3
main函数内 交换后a=3b=4
Press any key to continue
-------------------------------------------------------------------------------------------------------------------
我们可以看到,在main函数内,并没有把 a和b的值交换,因为这根本就不是a和b。不过是a和b在内存中的拷贝而已。
也就是说,当执行main的时候,程序会在内存中拷贝一份a和b,而拷贝的a和b,根本没有用到swap函数,所以不会交换。


这么说吧,就算你把main函数的a和b全部改为c和d 程序一样运行。结果是一样。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2、地址传递;
指针是干什么的? 当然是保存变量的内存地址。所一我们可以定义两个指针变量,用于保存变量的地址,于是 我们把
地址放到 指针上,让指针 指向我们传递的内存地址(内存空间)。那么我们 所传递的形参,只对应同一个地址,所以
这时的形参就可以看成实参了。
#include<iostream>
using namespace std;
void swap(int *a,int *b){
cout<<"swap a的地址"<<&a<<endl;
cout<<"swap b的地址"<<&b<<endl;
cout<<"swap函数 交换前"<<"a="<<*a<<"b="<<*b<<endl;
int temp;
temp=*a;
*a=*b;
*b=temp;
cout<<"swap a的地址"<<a<<endl;
cout<<"swap b的地址"<<b<<endl;
cout<<"swap函数 交换后"<<"a="<<*a<<"b="<<*b<<endl;
}
int main(){
int a=3;
int b=4;
cout<<"main a的地址"<<&a<<endl;
cout<<"main b的地址"<<&b<<endl;
cout<<"main函数内 交换前"<<"a="<<a<<"b="<<b<<endl;
swap(&a,&b);
cout<<"main a的地址"<<&a<<endl;
cout<<"main b的地址"<<&b<<endl;
cout<<"main函数内 交换后"<<"a="<<a<<"b="<<b<<endl;
return 0;
}
-------------------------------------------------------------------------------------------------------------------
运行结果
main交换前 a的地址0018FF44
main交换前 b的地址0018FF40
main函数内 交换前a=3b=4
swap交换前 a的地址0018FEEC
swap交换前 b的地址0018FEF0
swap函数 交换前a=3b=4
swap交换后 a的地址0018FF44
swap交换后 b的地址0018FF40
swap函数 交换后a=4b=3
main交换后 a的地址0018FF44
main交换后 b的地址0018FF40
main函数内 交换后a=4b=3
Press any key to continue
-------------------------------------------------------------------------------------------------------------------
如果有兴趣,你可以把上一个按值传递的方法,a和b的地址都打印一下,对比一下 就应该清楚了。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3、引用传递。
为什要用引用传递?什么是引用?它和指针的区别?(如是弄明白这三个问题,我感觉就应该没问题了)。
我们知道 引用的话 系统是不会为其开辟内存的。所以,a和b原来在内存中的位置就是我们引用的位置。
既然内存地址明确了,还怕它传不了参数?
#include<iostream>
using namespace std;
void swap(int &a,int &b){
cout<<"swap a的地址"<<&a<<endl;
cout<<"swap b的地址"<<&b<<endl;
cout<<"swap函数 交换前"<<"a="<<a<<"b="<<b<<endl;
int temp;
temp=a;
a=b;
b=temp;
cout<<"swap a的地址"<<&a<<endl;
cout<<"swap b的地址"<<&b<<endl;
cout<<"swap函数 交换后"<<"a="<<a<<"b="<<b<<endl;
}
int main(){
int a=3;
int b=4;
cout<<"main a的地址"<<&a<<endl;
cout<<"main b的地址"<<&b<<endl;
cout<<"main函数内 交换前"<<"a="<<a<<"b="<<b<<endl;
swap(a,b);
cout<<"main a的地址"<<&a<<endl;
cout<<"main b的地址"<<&b<<endl;
cout<<"main函数内 交换后"<<"a="<<a<<"b="<<b<<endl;
return 0;
}
-------------------------------------------------------------------------------------------------------------------
运行结果:
main a的地址0018FF44
main b的地址0018FF40
main函数内 交换前a=3b=4
swap a的地址0018FF44
swap b的地址0018FF40
swap函数 交换前a=3b=4
swap a的地址0018FF44
swap b的地址0018FF40
swap函数 交换后a=4b=3
main a的地址0018FF44
main b的地址0018FF40
main函数内 交换后a=4b=3
Press any key to continue
-------------------------------------------------------------------------------------------------------------------
只要多思考,多写写,在把上面的运行结果 对比一下。所有的问题就都解决了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C 语言中,函数传参方式三种:值传递(call by value)、引用传递(call by reference)和指针传递。 值传递是最常见的传参方式,它会将实参的值复制一份给形参,在函数调用过程中,实参的值不会改变。编译器在函数调用时会将实参的值通过栈传递到函数中,并为参数分配内存空间,函数对参数的修改不会影响到实参。这种方式适用于基本数据类型的参数传递,例如整数、浮点数等,以及结构体或对象的参数传递。 引用传递是通过指针间接访问实参的值,使得函数中对参数的修改能够影响到实参。编译器在函数调用时会将实参的地址传递给形参,在函数内部通过指针间接访问实参的值。这种方式适用于需要修改实参值的情况,例如交换两个变量的值或者修改数组元素等。 指针传递与引用传递类似,通过指针来传递参数。编译器在函数调用时会将指针的值传递给形参,使得函数能够通过指针来访问实参的值。这种方式适用于需要修改实参值或者函数返回多个值的情况,例如动态内存分配、链表操作等。 这三种传参方式的选择取决于函数的需求和实参的特点。一般来说,如果函数中不需要修改实参的值,可以使用值传递;如果函数需要修改实参的值,可以使用引用传递或指针传递。其中,引用传递可以简化对指针的操作,但同时也增加了代码的复杂性,而指针传递需要谨慎处理指针的空指针问题。因此,在选择传参方式时需要考虑函数的功能需求、实参的特点以及代码的复杂性和可读性等因素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值