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;
}
四、三种形参传递方式的比较
- 值传递和地址传递是在内存中为所有形参和新声明的变量新开辟一块空间来存储。在新的内存空间中,使用值传递存储的是与实参值相等的数据,不会直接改变实参的值;在新的内存空间中,使用地址传递存储的是实参的地址,操作的是实参地址指向的内容,所以会直接改变实参的值。
- 引用传递只为新声明的变量开辟内存空间,而形参是实参的地址(形参是实参地址的别名),与地址传递相似,引用传递操作的是实参地址指向的内容,所以会直接改变实参的值。
【代码示例】
#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个字节空间。