如何区别指针和引用?

上一文中讲述了何谓指针  C++的指针总结 - 唯有自己强大 - 博客园 (cnblogs.com)

但是初学C++时,很容易把指针和引用的用法混在一起,下面通过一些示例来说明指针和引用两者之间的差别。

首先,先说一下 什么是引用?

正如同水浒传中的108位好汉,他们除了各自的名字以外都有一个"绰号"。这个绰号在C语言中就是引用

引用的具体解释是:为已存在的变量取了一个别名,引用和引用的变量共用同一块内存空间

格式:类型& 引用变量名(对象名) = 引用实体;   int& ra = a;  ra为a的引用

说明:

  1. 引用实体和引用类型必须为同种类型
  2. 引用在定义时必须初始化
  3. 引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。(一个实体可以有多个引用,但一个引用只能引用一个实体)
  4. &在此不是求地址运算,而是起标识作用。

常引用: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:指针和引用都可以作为函数参数,改变实参的值。

 

引用博文:C++中指针与引用的区别 - 知乎 (zhihu.com)

posted @ 2021-05-11 19:43  唯有自己强大  阅读(593)  评论(0编辑  收藏  举报