指针:指针是一个变量,只不过这个变量中存储的是一个地址,指向内存中的一个单元。
引用:引用和原变量是同一个东西,只不过是原变量的一个别名。
int a = 10; // 定义一个整型变量a
int *p = &a; // 定义一个指向整型变量的指针变量p,该指针指向a的存储单元,即p的值是a存储单元的地址
int &b = a; // 定义一个整型变量a的引用,a和b是同一个东西,在内存中占用同一个存储单元
一、引用
int a = 10;
int &b = a;
int &b = a;
等价于int *const b = a;
,即引用是一个指针常量(又称常指针,即一个常量,其类型是指针)
二、常引用
int a = 10;
const int &b=a;
const int &b = a;
等价于const int * const b = a;
不仅仅是b
这个地址不可修改,而且其指向的内存空间也不可修改。
三、引用的特性
- 引用在定义时必须初始化
- 一个变量可以有多个引用
- 引用一旦绑定某个实体,就不能再是其他变量的引用。
四、引用的使用场景
1、给变量起别名
int a;
int &b = a;
2、将引用作为函数的参数
使用引用类型就不必在swap中声明形参是指针变量,指针变量要另外开辟内存单元,其内容是地址。
而引用变量不是一个独立的变量,不单独占内存单元。而且在调用swap函数时,只需要传值即可,将引用作为函数的形参更加简单、直观、方便。
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
3、返回值
// 值返回
int Add(int a, int b){
return a + b;
}
// 引用返回
int& Add(int & a, int& b){
int c = a + b;
return c;
}
五、引用、指针(区别与联系)
1、相同点
底层的实现方式相同,都是按照指针的方式实现的
2、不同点
- 引用定义的时候必须初始化,指针可以不用初始化;
- 引用一旦初始化为指向一个对象,就不能再指向其他对象,而指针可以在任何时候指向任何一个同类型的对象;
- 没有空引用,但是有空指针;
- 在sizeof中的含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节的个数(在32为平台下,指针求sizeof永远是4);
- 引用++改变的是变量的内容,指针++改变的是指针的指向;
- 有多级指针,没有多级引用;
- 引用使用起来比指针安全;
- 如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄漏;