如何区别指针和引用?
上一文中讲述了何谓指针 C++的指针总结 - 唯有自己强大 - 博客园 (cnblogs.com)
但是初学C++时,很容易把指针和引用的用法混在一起,下面通过一些示例来说明指针和引用两者之间的差别。
首先,先说一下 什么是引用?
正如同水浒传中的108位好汉,他们除了各自的名字以外都有一个"绰号"。这个绰号在C语言中就是引用。
引用的具体解释是:为已存在的变量取了一个别名,引用和引用的变量共用同一块内存空间
格式:类型& 引用变量名(对象名) = 引用实体; int& ra = a; ra为a的引用
说明:
- 引用实体和引用类型必须为同种类型
- 引用在定义时必须初始化
- 引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。(一个实体可以有多个引用,但一个引用只能引用一个实体)
- &在此不是求地址运算,而是起标识作用。
常引用:const 类型标识符 &引用名=目标变量名;(如const int& ra = a;)
用这种方式声明的引用,不能通过引用对目标变量的值进行修改,从而使引用的目标成为const,达到了引用的安全性。
int a ; const int &ra=a; ra=1; //错误 a=1; //正确 只能对原名称修改
言归正传,引用与指针的区别在于:
如果说梁山好汉的绰号是引用的话,那他们的身份证号码就是指针。展开来说就是:
- 指针是一个变量,存储的是一个地址,指向内存的一个存储单元;
- 引用是原变量的一个别名,跟原来的变量实质上是同一个东西;
int a = 996; int *p = &a; // p是指针, &在此是求地址运算 int &r = a; // r是引用, &在此起标识作用
(1)指针初始化之后可以再改变,引用不可以
int a = 996; int *p = &a; // 初始化, p 是 a 的地址(&a获取a的地址赋给指针*p) int &r = a; // 初始化, r 是 a 的引用 int b = 885; p = &b; // 合法, p 更改为 b 的地址 r = b; // 不合法, r 不可以再变
(2)指针可以有多级,引用只能是一级
int **p; // 合法 int &&a; // 不合法
(3) 指针可以在定义的时候不初始化,引用必须在定义的时候初始化
int *p; // 合法 int &r; // 不合法 int a = 996; int &r = a; // 合法
(4) 指针可以指向null,引用不可以为null
int *p = NULL; // 合法 int &r = NULL; // 不合法
(5)自增运算意义不同
int a = 996; int *p = &a; int &r = a; p++; //指向a后面的内存地址(输出:地址+4) r++;//等于a++(输出:997)
(6)指针和引用作为函数参数时,指针需要检查是否为空,引用不需要
void fun_p(int *p) { // 需要检查P是否为空 if (p == NULL) { // do something } } void fun_r(int &r) { // 不需要检查r // do something }
PS:指针和引用都可以作为函数参数,改变实参的值。