【C++】函数形参的三种传递方式

C++函数形参的传递方式有三种:值传递、地址传递和引用传递。

一、值传递

在调用函数使用值传递时,形参不能修饰实参,也就是在函数体内不能直接改变实参的值。
【代码示例】

//使用值传递
void mySwap01(int a, int b){
	int temp=a;
	a=b;
	b=temp;
}

二、地址传递

在调用函数使用地址传递时,形参修饰实参,也就是在函数体内可以直接改变实参的值。
【代码示例】

//使用地址传递
void mySwap02(int *a, int *b){
	int temp=*a;
	*a=*b;
	*b=temp;
}

【注意】
不能写成下边的形式,下边的代码实际是在内存的另一块空间进行变量a和b地址的交换,不能改变实参的值。

int *temp=a;
a=b;
b=*temp;

三、引用传递

在调用函数使用引用传递时,形参修饰实参,也就是在函数体内可以直接改变实参的值。
【代码示例】

void mySwap03(int &a, int &b){
	int temp=a;
	a=b;
	b=temp;
}

四、三种形参传递方式的比较

  1. 值传递和地址传递是在内存中为所有形参和新声明的变量新开辟一块空间来存储。在新的内存空间中,使用值传递存储的是与实参值相等的数据,不会直接改变实参的值;在新的内存空间中,使用地址传递存储的是实参的地址,操作的是实参地址指向的内容,所以会直接改变实参的值。
  2. 引用传递只为新声明的变量开辟内存空间,而形参是实参的地址(形参是实参地址的别名),与地址传递相似,引用传递操作的是实参地址指向的内容,所以会直接改变实参的值。

【代码示例】

#include <iostream>
using namespace std;

void mySwap01(int a1, int b1);
void mySwap02(int *a2, int *b2);
void mySwap03(int &a3, int &b3);

int main(){

    int a=100;
    int b=200;
    cout<<"main函数中 a 的地址:"<<(long)&a<<endl;
    cout<<"main函数中 b 的地址:"<<(long)&b<<endl<<endl;
    mySwap01(a, b);
    mySwap02(&a, &b);
    mySwap03(a, b);
    
    return 0;
}

void mySwap01(int a1, int b1){
	int temp=a1;
	a1=b1;
	b1=temp;
    cout<<"mySwap01函数中 a1   的地址:"<<(long)&a1<<endl;
    cout<<"mySwap01函数中 b1   的地址:"<<(long)&b1<<endl;
    cout<<"mySwap01函数中 temp 的地址:"<<(long)&temp<<endl<<endl;
}
void mySwap02(int *a2, int *b2){
	int temp=*a2;
	*a2=*b2;
	*b2=temp;
    cout<<"mySwap02函数中 a2   的地址:"<<(long)&a2<<endl;
    cout<<"mySwap02函数中 b2   的地址:"<<(long)&b2<<endl;
    cout<<"mySwap02函数中 temp 的地址:"<<(long)&temp<<endl<<endl;
}
void mySwap03(int &a3, int &b3){
	int temp=a3;
	a3=b3;
	b3=temp;
    cout<<"mySwap03函数中 a3   的地址:"<<(long)&a3<<endl;
    cout<<"mySwap03函数中 b3   的地址:"<<(long)&b3<<endl;
    cout<<"mySwap03函数中 temp 的地址:"<<(long)&temp<<endl;
}

【打印结果】

main函数中 a 的地址:140737488346320
main函数中 b 的地址:140737488346324

mySwap01函数中 a1   的地址:140737488346284
mySwap01函数中 b1   的地址:140737488346280
mySwap01函数中 temp 的地址:140737488346292

mySwap02函数中 a2   的地址:140737488346280
mySwap02函数中 b2   的地址:140737488346272
mySwap02函数中 temp 的地址:140737488346292

mySwap03函数中 a3   的地址:140737488346320
mySwap03函数中 b3   的地址:140737488346324
mySwap03函数中 temp 的地址:140737488346292

从打印结果中可以得出以上的分析。

【图示】
下图是三个mySwap函数中执行到第一句时,也就是分别执行到int temp=a1;、int temp=*a2;、int temp=a3;内存中的情况。
在这里插入图片描述

本文使用的编译器环境为linux64,也就是指针占用8个字节空间。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值