- 指针:指针是一个变量,只不过这个变量中存储的是一个地址,指向内存中的一个单元。
- 引用:引用和原变量是同一个东西,只不过是原变量的一个别名。
1
2
3int a = 10; 定义一个整型变量a
int *p = &a; 定义一个指向整型变量的指针变量p,该指针指向a的存储单元,即p的值是a存储单元的地址
int &b = a; 定义一个整型变量a的引用,a和b是同一个东西,在内存中占用同一个存储单元
一、引用的特性:
- 引用在定义时必须初始化
- 一个变量可以有多个引用
- 引用一旦绑定某个实体,就不能再是其他变量的引用。
二、引用和指针的区别与联系:
- 1.相同点:
- 底层的实现方式相同,都是按照指针的方式实现的
- 2.不同点:
- 1.传值
- 这种传递方式中,实参和形参是两个不同的地址空间,参数传递的实质是将原函数中变量的值,复制到被调用函数形参所在的存储空间中,这个形参的地址空间在函数执行完毕后,会被回收掉。整个被调用函数对形参的操作,只影响形参对应的地址空间,不影响原函数中变量的值,因为这两个不是同一个存储空间。
即使形参的值在函数中发生了变化,实参的值也完全不会受到影响,仍为调用前的值。
- 这种传递方式中,实参和形参是两个不同的地址空间,参数传递的实质是将原函数中变量的值,复制到被调用函数形参所在的存储空间中,这个形参的地址空间在函数执行完毕后,会被回收掉。整个被调用函数对形参的操作,只影响形参对应的地址空间,不影响原函数中变量的值,因为这两个不是同一个存储空间。
- 2.传地址
- 这种传递方式中,实参是变量的地址,形参是指针类型的变量,在函数中对指针变量的操作,就是对实参(变量地址)所对应的变量的操作,函数调用结束后,原函数中的变量的值将会发生改变。
被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。
- 这种传递方式中,实参是变量的地址,形参是指针类型的变量,在函数中对指针变量的操作,就是对实参(变量地址)所对应的变量的操作,函数调用结束后,原函数中的变量的值将会发生改变。
- 3.传引用
- 这种传递方式中,形参是引用类型变量,其实就是实参的一个别名,在被调用函数中,对引用变量的所有操作等价于对实参的操作。这样,整个函数执行完毕后,原先的实参的值将会发生改变。
被调函数对形参做的任何操作都影响了主调函数中的实参变量。
- 这种传递方式中,形参是引用类型变量,其实就是实参的一个别名,在被调用函数中,对引用变量的所有操作等价于对实参的操作。这样,整个函数执行完毕后,原先的实参的值将会发生改变。
- 4.哪种更高效?
五、引用的使用场景
1.给变量起别名
1
2int a;
int &b = a;2.将引用作为函数的参数
- 使用引用类型就不必在swap中声明形参是指针变量,指针变量要另外开辟内存单元,其内容是地址。而引用变量不是一个独立的变量,不单独占内存单元。而且在调用swap函数时,只需要传值即可,将引用作为函数的形参更加简单、直观、方便。
1
2
3
4
5
6
7void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
- 使用引用类型就不必在swap中声明形参是指针变量,指针变量要另外开辟内存单元,其内容是地址。而引用变量不是一个独立的变量,不单独占内存单元。而且在调用swap函数时,只需要传值即可,将引用作为函数的形参更加简单、直观、方便。
3.返回值
1
2
3
4
5
6
7
8
9
10
11// 值返回
int Add(int _iLeft, int _iRight)
{
return _iLeft + _iRight;
}
// 引用返回
int& Add(int & _iLeft, int& _iRight)
{
int iResult = _iLeft + _iRight;
return iResult;
}
六、代码实例
1 |
|