CPP学习之——按值传递按址传递及按引用传递(9.6-9.8)

一 概述

我们之前讲过的参数传递方式都是按值传递,什么是按值传递和按址传递呢?这是本节课要讲述的内容

  • 按值传递
  • 按址传递
  • 按引用传递

二 按值传递

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