一 概述
我们之前讲过的参数传递方式都是按值传递,什么是按值传递和按址传递呢?这是本节课要讲述的内容
二 按值传递
2.1 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include<iostream> using namespace std; void swap(int a,int b) { int c; cout<<"swap函数中,交换前,a:"<<a<<"\t b:"<<b<<endl; c=a; a=b; b=c; cout<<"swap函数中,交换后,a:"<<a<<"\t b:"<<b<<endl; };
int main() { int a=3,b=4; cout<<"main函数中,交换前,a:"<<a<<"\t b:"<<b<<endl; swap(a,b); cout<<"main函数中,交换后,a:"<<a<<"\t b:"<<b<<endl; return 0; }
|
2.2 输出结果
1 2 3 4
| main函数中,交换前,a:3 b:4 swap函数中,交换前,a:3 b:4 swap函数中,交换后,a:4 b:3 main函数中,交换后,a:3 b:4
|
2.3 现象
- main函数中a和b的值,没有发生改变
- swap函数中,a和b的值发生了改变
- 假如说swap函数没有交换主程序中的a和b,那么它交换的到底是谁的值呢?
2.4 说明
- 这个问题看起来复杂,其实很简单,swap函数交换的是main函数中a和b的副本的值,也就是说在main函数中定义的a和b的备份的值
- swap函数交换的是main函数中的a和b的副本,而不是a和b的本身。那么为什么swap函数不直接交换a和b本身,却去交换它们的副本的值呢?
- 这是因为当我们直接将a和b传递给swap函数时,这样的传递方式是按值传递
2.5 结论
- 假如将a和b按值传递给swap函数,那么编译器会自动在栈中创建a和b的拷贝,然后将a和b的拷贝传递给swap函数。
- 在swap函数中对a和b的拷贝进行交换。因此我们看到的输出语句,a和b确实进行了交换,只不过交换的是a和b的副本
- 由于交换的是a和b的副本,并不是a和b本身,所以在swap函数结束后,输出的值显示main函数中的a和b并没有改变
三 按址传递
3.1 定义
按址传递从字面上理解就是按地址的方式传递
3.2 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include<iostream> using namespace std; void swap(int *a,int *b) { int c; cout<<"swap函数中,交换前,a:"<<*a<<"\t b:"<<*b<<endl; c=*a; *a=*b; *b=c; cout<<"swap函数中,交换后,a:"<<*a<<"\t b:"<<*b<<endl; };
int main() { int a=3,b=4; cout<<"main函数中,交换前,a:"<<a<<"\t b:"<<b<<endl; swap(&a,&b); cout<<"main函数中,交换后,a:"<<a<<"\t b:"<<b<<endl; return 0; }
|
3.3 输出结果
1 2 3 4
| main函数中,交换前,a:3 b:4 swap函数中,交换前,a:3 b:4 swap函数中,交换后,a:4 b:3 main函数中,交换后,a:4 b:3
|
四 按引用传递
4.1 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include<iostream> using namespace std; void swap(int &a,int &b) { int c; cout<<"swap函数中,交换前,a:"<<a<<"\t b:"<<b<<endl; c=a; a=b; b=c; cout<<"swap函数中,交换后,a:"<<a<<"\t b:"<<b<<endl; };
int main() { int a=3,b=4; cout<<"main函数中,交换前,a:"<<a<<"\t b:"<<b<<endl; swap(a,b); cout<<"main函数中,交换后,a:"<<a<<"\t b:"<<b<<endl; return 0; }
|
4.2 输出结果
1 2 3 4
| main函数中,交换前,a:3 b:4 swap函数中,交换前,a:3 b:4 swap函数中,交换后,a:4 b:3 main函数中,交换后,a:4 b:3
|