C++参数的三种传递方式

三种传递方式为:值传递,地址传递(指针传递),引用传递

先说说形参和实参

形参是指在函数定义中声明的参数,用于接收函数调用中的实参

实参是指函数调用中传递的参数,即在函数调用中传递给函数的参数值

举例:

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值