这里不细分C语言和C++的区别,简单讨论C++的的函数传值方式。
讨论参数传递的时候,我们将一个参数变量看成(address:value)。
C++中函数的参数传递有三种方式:
- 值传递:在C/C++中,值传递就是函数体的参数没有加*或者&,为什么叫值传递呢?就是因为我们只是将值传进函数体内了,但是参数的地址,我们并没有传递进去,简单来说就是只是简单复制了值而已。
示例代码:
#include<iostream>
using namespace std;
void swap(int a,int b)
{
cout<<"***********************"<<endl;
cout<<"a:address="<<&a<<",value="<<a<<endl;
cout<<"b:address="<<&b<<",value="<<b<<endl;
}
int main(){
int a = 0,b = 1;
cout<<"a:address="<<&a<<",value="<<a<<endl;
cout<<"b:address="<<&b<<",value="<<b<<endl;
swap(a,b);
return 0;
}
结果:
上面代码就是打印函数体内外的参数地址和值,通过比较我们发现,函数体内外的参数的value是一样的,但是地址完全不一样。这就是“值传递”的作用。
- 指针传递
指针是C和C++标志性的东西,简单来说就是地址。指针传递其实跟值传递是一样的,看到这里别慌砍我,地址也是一个值,只不过我们通过地址这个值得到这个地址所存放的值,就是通过*a = 0。当你在函数体改变传入的参数的时候,其实是修改内存中特定地址的value,这个地址函数内外都是一样的,因此我们才能用指针传递的方法交换两个值。
代码如下:
#include<iostream>
using namespace std;
void swap(int *a,int *b)
{
cout<<"***********************"<<endl;
cout<<"a:address="<<a<<",value="<<*a<<endl;
cout<<"b:address="<<b<<",value="<<*b<<endl;
}
int main(){
int a = 0,b = 1;
cout<<"a:address="<<&a<<",value="<<a<<endl;
cout<<"b:address="<<&b<<",value="<<b<<endl;
swap(&a,&b);
return 0;
}
结果:
跟值传递比较,发现函数体内的ab地址和函数体外的ab地址是一样的,但是我们不能说指针传递就是把地址和值一起传进来,如果我们将地址看成一个值,那么就是传进了值,如果将地址单独看成地址,那么就是传进了地址。
- 引用传递
实际就是通过指针来实现的,看别的博客介绍就是效果如指针传递,可是使用方法如传值。通过代码演示,我们可以知道,引用其实是将地址和值一起传进函数体内了。
代码:
#include<iostream>
using namespace std;
void swap(int &a,int &b)
{
cout<<"***********************"<<endl;
cout<<"a:address="<<&a<<",value="<<a<<endl;
cout<<"b:address="<<&b<<",value="<<b<<endl;
}
int main(){
int a = 0,b = 1;
cout<<"a:address="<<&a<<",value="<<a<<endl;
cout<<"b:address="<<&b<<",value="<<b<<endl;
swap(a,b);
return 0;
}
结果:
根据结果,我们知道函数体内外的ab地址和值都是一模一样的,而且我们修改函数体内的值,函数体外的值也会跟着修改。
使用建议:
对于值传递,这个目的其实很简单,就是不希望函数体的操作影响到函数体外的值,比如我们想把支付宝的余额给别人看,但是我们不希望别人修改了消息数字而修改了我们支付宝余额,则可以使用值传递,我们只是发给别人一串数字,别人修改数字,并不影响我们的支付宝余额。
对于指针传递和引用传递,我不能说哪个好,因为一般情况下,两者都可以达到相同的效果,引用传递的代码会更加简单和明了,所以一般情况下,建议使用引用,比如要交换两个数。但是如果你写的函数体需要对地址进行操作,建议用指针,因为指针指向的就是地址,指针的加减乘除就是对地址的改变,有些情况下地址的改变比引用更方便,这里提醒一下,希望你在使用指针之前,能够理解指针是如何移动的,如果不熟悉指针的移动的话,可能会有一些麻烦。
在我编写嵌入式程序的时候,常常需要用到指针,面试的时候,也经常考指针的移动的问题,希望大家能够重视指针使用的问题。