三种传递方式为:值传递,地址传递(指针传递),引用传递
先说说形参和实参
形参是指在函数定义中声明的参数,用于接收函数调用中的实参
实参是指函数调用中传递的参数,即在函数调用中传递给函数的参数值
举例:
void add(int a;int b){
cout<<a+b<<endl;
}
int main(){
int x=1,y=2;
add(x,y);
return;
}
...
上面的代码中函数add()用两个形参为a和b,分别用于接收int类型的参数;在调用add()函数的时候,传递了两个实参x,y,它们的值被赋值到函数的形参a和b中,最终输出3;
总的来说,形参和实参一起完成了函数的参数传递过程,让函数能够接收外部传递的参数,并在内部进行处理和计算
1.值传递
值传递是指将函数参数复制一份给形参,参数内部操作的是形参的值,而不是实参的值,因此函数的内部的修改不会影响实参的值
void swap(int x,int y){
int temp=x;
x=y;
y=temp;
std::cout<<"Swap x="<<x<<",y="<<y<<std::endl;
}
int main(){
int a=10,b=20;
std::cout<<"Before swap a="<<a<<",b"<<b<<std::endl;
swap(a,b);
std::cout<<"After swap a="<<a<<",b="<<b<<std::endl;
return;
}
...
结果:
Before swap a=10,b=20;
Swap x=20,y=10;
a=10;b=20;
可以看出,在swap函数的内部,x和y的值被交换了,但在函数外部,a和b的值没有发生变化.这是因为swap函数只是操作了形参x和y,并没有操作实参啊a和b.
2.地址传递(指针传递)
地址传递是通过传递指向内存地址的指针来传递参数的方式,进而在函数内部对原变量进行修改的目的
地址传递的详细说明:
- 在函数参数声明中使用指针类型来声明地址传递
- 使用&运算符来获取变量的地址传递给函数
- 在函数体中通过指针来访问和修改传入的变量
- 在函数的调用中需要将变量的地址传递给函数
- 可以用空指针检验指针是否有效
- 建议在函数的参数声明中使用const关键字来声明指针,可防止函数修改被传入的变量
- 建议在函数体使用指针前,先进行非空判断,以防止指针指向扛得住而导致程序崩溃
例子:
void func(int* ptr){
if(ptr==null){
cout<<"Error:the pointer is null<<endl;
return;
}
*ptr=10; //将指针的所指位置设为10;
}
地址传递的一个简单例子:
#include<iostream>
using namespace std;
void increament(int* p){
(*p)++; //对指针所指的值加1
}
int main(){
int num=5;
increament(&num); //讲num的地址传递给increament函数
cout<<num<<endl
return 0;
}
...
输出:6
上面的代码定义可以一个increament函数,参数为int指针类型p.在函数内,对p所指的值加1
main函数中,把num的地址通过&运算符传递给increament函数,让其能够访问并且修改num的值
如何防止num的值被更改
#include<iostream>
using namespace std;
void increament(const int* p)
{
//(*p)++; //报错,表达式必须是可修改的左值
cout<<*p<<endl;
}
int main(){
int num=5;
cout<<(&num)<<endl;
return 0;
}
输出:5
3.引用传递
引用传递将变量的引用作为函数的形参,以实现函数内部操作对原始变量的修改,则不需要复制变量的值
引用的定义
引用是一个别名,提供了对另一个变量或对象的便捷访问方式.与指针不同,一旦定义了引用,它就不能被重新定义或者指向其他对象;引用也可以用于函数参数和返回值,允许在函数调用的过程中直接访问原始变量或者对象的值,而不是复制他们
为什么引用一旦被定义,就不能被重新定义或者指向其他对象
引用在C++中是一种别名,他在创建时就绑定到特定的对象上
例子:
int a; //定义a是整型变量
int &b=a; //定义b是a的引用
//注意:&在数据类型后面出现时,代表引用声明符,其他场合是取地址符
//当b是a的引用时,b和a有相同的作用
引用的本质--指针常量
引用的本质是一个指针常量,他的指向不可更改,只能指向一个指定的变量
int a=10;
int& b=a;
语句自动转化为int * const b=&a;
若在程序中声明了b是a的引用,相当于在内存中开辟一个指针型的存储单元,存放变量a的地址,使用引用b的所指向的变量a,相当于使用了*b.
引用作为返回值的例子
//返回数组中的最大值和最小值
void findMinMax(int* arr,int size,int& minVal,int& maxVal){
minVal=maxVal=arr[];
for(int i=1;i<size;i++){
if(arr[i]<minVal)
minVal=arr[i];
if(arr[i]>maxVal)
maxVal=arr[i];
}
}
int main(){
int arr[5]={3,5,1,9,4};
int minVal,maxVal;
findMinMax(arr,5,minVal,MaxVal);
cout<<"minVal"=minVal<<",maxVal="<<maxVal<<endl;
return 0;
}