在C++中,指针*(pointer)与引用&(reference)的用法十分相似,但还是有一些区别的。我做了如下总结:
指针* | 引用& | |
---|---|---|
写法 | int* p1 = # | int& r1 = num; |
有无实体 | 指针是实体,有空间,有数据 | 引用是别名,没有空间 |
初始化 | 定义时可以不初始化 | 定义时必须初始化int&r; //出错:引用必须初始化 |
为空 | 可以为空,但为防止其为空,指针总是需要被测试它的合法性 | 不能为空,引用必须与一块合法的存储单元关联,但这也意味着使用引用的代码效率比使用指针的要高,因为在使用引用之前不需要测试它的合法性 |
sizeof()函数 | sizeof(指针):计算的是指针本身的大小 | sizeof(引用):计算的是它引用的对象的大小 |
改变值 | 改变指针的值,就是改变指针本身的值(改变了指针指向的地址)int* p1 = &num1; p1 = &num2; //指针p1的值被改变(从指向num1的地址变成了指向num2的地址) | 改变引用的值,即是在改变对引用的变量的值,而引用本身不能改变。int& r1 = num1; r1 = num2; //引用r1未被改变,改变的是num1的值(num1的值变为了num2) |
多级 | 可以存在多级指针int** p1; //合法。指向指针的指针 int*& p2; //合法。指向指针的引用 | 不存在多级引用int&* p3; //非法。指向引用的指针是非法的 int&& p4; //非法。指向引用的引用是非法的 |
安全性 | 没有引用安全:1. 指针需要空间,需要向系统申请内存和释放内存 2. 指针指向的地址可以随意改变 | 较安全:1. 引用不关心内存申请和释放问题,不会存在内存泄漏 2. 引用的对象一旦确定就不可改变 3. 引用的生命周期就在函数体内,离开作用域就不存在了,比较安全 |