九(4).存在指针的引用,不存在引用的指针
存在指针的引用,不存在引用的指针
一.如何理解
1. “存在指针的引用”(Pointer to Reference)
(1) 语法与含义
指针可以指向引用(即
T*&
或const T*&
),但引用本身不能指向指针(即没有&*
这种语法)。指针的引用 是一个“对指针的别名”,修改它会影响原始指针。
2. “不存在引用的指针”(Reference to Pointer)**
(1) 语法与含义
C++ 没有“引用的指针”这种语法(即没有
&*
或类似的语法结构)。引用本身是别名,不能指向其他引用(引用不能重新绑定)。
指针可以指向任何对象(包括引用),但引用不能指向指针。
3.如何定义存在指针的引用
void testA()
{int a = 10;int* pa = &a;// 存在指针的引用int*& rpa = pa;cout << "*rpa = " << *rpa << endl;}testA(); // *rpa = 10}
如何定义引用的指针
void testB()
{int c = 5;int&d = c;// 不存在引用的指针int&* rpd ; // ERROR
}
二. “存在指针的引用”(Pointer to Reference)
(1) 语法与含义
-
指针可以指向引用(即
T*&
或const T*&
),但引用本身不能指向指针(即没有&*
这种语法)。 -
指针的引用 是一个“对指针的别名”,修改它会影响原始指针。
-
语法:
int x = 10;
int* ptr = &x; // ptr 是指向 x 的指针
int*& ref_to_ptr = ptr; // ref_to_ptr 是 ptr 的引用(对指针的别名)
-
ref_to_ptr
是ptr
的引用,修改ref_to_ptr
会直接影响ptr
。
(2) 实例
#include <iostream>
using namespace std;int main() {int x = 10;int* ptr = &x; // ptr 指向 xint*& ref_to_ptr = ptr; // ref_to_ptr 是 ptr 的引用*ref_to_ptr = 20; // 通过 ref_to_ptr 修改 x 的值cout<< x << endl; // 输出 20(x 被修改)int y = 30;ref_to_ptr = &y; // 通过 ref_to_ptr 修改 ptr 的指向cout << *ptr << endl; // 输出 30(ptr 现在指向 y)
-
ref_to_ptr
是ptr
的引用,修改ref_to_ptr
会直接影响ptr
的指向和内容。
(3) 关键点
-
指针的引用是合法的,但很少直接使用(通常用普通指针或智能指针替代)。
-
用途:
-
需要传递指针的别名(避免拷贝指针)。
-
在函数中修改调用者的指针(如动态内存管理)。
-
三. “不存在引用的指针”(Reference to Pointer)**
(1) 语法与含义
-
C++ 没有“引用的指针”这种语法(即没有
&*
或类似的语法结构)。 -
引用本身是别名,不能指向其他引用(引用不能重新绑定)。
-
指针可以指向任何对象(包括引用),但引用不能指向指针。
(2) 为什么不存在“引用的指针”?
-
引用的本质:
-
引用是变量的别名,不是独立的对象。
-
引用一旦绑定后不能重新绑定(不能指向其他变量)。
-
-
指针的本质:
-
指针是存储地址的变量,可以指向任何对象(包括引用)。
-
指针可以重新指向其他对象(可以“指向”引用,但无实际意义)。
-
(3)尝试“引用的指针”的错误示例
int x = 10;
int& ref = x; // ref 是 x 的引用
int*& ptr_to_ref = &ref; // 错误!不能取引用的地址(&ref 是非法操作)
错误原因:
-
&ref
尝试取引用的地址,但引用没有独立的内存地址(它是别名)。 -
C++ 不允许对引用取地址(
&ref
是非法的)
四. 关键对比:指针的引用 vs 引用的指针
概念 | 指针的引用 (T\*& ) | 引用的指针(不存在) |
---|---|---|
语法合法性 | 合法(int*& ref_to_ptr = ptr; ) | 非法(&ref 是非法操作) |
用途 | 修改指针的指向或内容 | 无实际用途(引用不能取地址) |
生命周期影响 | 修改 ref_to_ptr 会影响 ptr | 无(不存在) |
示例 | int*& ref = ptr; | int*& ptr_to_ref = &ref; (错误) |