指针的引用 *&

1. 指针的引用就是对指针变量的引用

解释一下就是

typedef int* PINT;	//给指向整形的指针类型定义一个新名字PINT
PINT *p1;			//定义一个指向指针的指针
PINT &p2;			//为指针定义一个别名p2

2. 指针的引用有什么用

以链队初始化为例

typedef struct	//结构体定义
{
	QNode *front;
	QNode *rear;
}LiQueue;
void initQueue(LiQueue *&lqu)	//初始化队列
{
	lqu = (LiQueue*)malloc(sizeof(LiQueue));
	lqu -> front = lqu->rear = NULL;
}

函数形参为 *&lqu ,即传入的是对指向LiQueue的指针的引用,这样对传入的指针赋值,调用函数时传入的指针指向也会改变

如果形参LiQueue *lqu不是指针的引用,
那么对形参进行重新赋值不会影响到实参的值
原指针未受到影响,队列初始化失败

注意:
能否理解的重点是
如果不是指针引用
指针的指向改变并不能影响原指针的指向
指针指向的值的改变可以影响到原值

也就是说
如果不是指针引用,
形参指针指向改变对实参指针指向没有影响,
形参指针指向值大小改变,实参指针指向值大小随之改变

理解实参和形参是什么

`T*&` 表示“指向类型 `T` 的指针引用”。这个语法看起来有点绕,但我们可以一步步拆解它的含义。 --- ### 回答问题:**为什么引用指针是 `*&`?** #### 1. 语法解析 ```cpp int* ptr; // ptr 是一个指向 int 的指针 int*& ref_ptr; // ref_ptr 是一个对“指向 int 的指针”的引用 ``` - `int*` 是一种类型:指向 `int` 的指针。 - `int*&` 就是对这种类型的引用。 所以: ```cpp TreeNode*& root; ``` 表示:`root` 是一个 **引用**,它绑定到一个 `TreeNode*` 类型的变量(即一个指针)上。 > ✅ 等价于:我说“我是一个引用,我绑定了某个 `TreeNode*` 变量”,修改我就等于修改那个原始指针。 --- #### 2. 为什么不是 `&*` 或其他顺序? C++ 声明符是从右到左结合的,而且声明应与其使用方式一致。 考虑下面的例子: ```cpp int a = 10; int& r = a; // r 是 a 的引用,r 就是 a ``` 现在扩展到指针: ```cpp TreeNode* root = nullptr; TreeNode*& ref = root; // ref 是 root 的引用 → ref 就是 root ``` 当你写 `ref`,你就是在操作 `root` 本身。因此: - `ref` 的类型必须是 `TreeNode*&`,表明它是 `TreeNode*` 类型对象的引用。 - `&` 是引用符号,修饰的是变量名; - `*` 属于基础类型的一部分(指针类型); 所以 `T*&` 的结构是合理的: 👉 “我是一个引用(`&`),引用的是一个 `T*` 类型的东西”。 --- #### 3. 对比错误理解 有人误以为 `&*` 应该表示“引用指针”,这是把运算符和声明混淆了。 - `&` 和 `*` 在表达式中是操作符: - `&x` 取地址 - `*p` 解引用 - 但在类型声明中: - `int*&` 是一种复合类型 —— “指针引用” 例如: ```cpp TreeNode* p; TreeNode*& ref = p; // 正确:建立引用 ref = new TreeNode(); // 修改 p ``` 如果你尝试写成 `&* ref`,那是非法语法。 --- #### 4. 实际例子说明 ```cpp #include <iostream> using namespace std; struct TreeNode { int val; TreeNode(int x) : val(x) {} }; void setRoot(TreeNode*& root) { delete root; // 删除旧节点(如果非空) root = new TreeNode(99); // 直接修改外部传进来的指针! } int main() { TreeNode* root = nullptr; cout << "Before: " << root << endl; setRoot(root); // 传入指针引用 cout << "After: " << root << ", value: " << root->val << endl; delete root; return 0; } ``` 输出可能为: ``` Before: 0 After: 0x5555557d8eb0, value: 99 ``` ✅ 成功修改了 `root` 指针本身。 因为 `setRoot` 接收的是 `root` 的别名(引用),不是副本。 --- ## 总结 - `T*&` 是 C++ 中用于表示“指针引用”的标准语法。 - 它允许函数直接修改原始指针变量,而不仅仅是它指向的内容。 - 之所以是 `*&` 而不是别的顺序,是因为类型声明遵循“从右向左”阅读规则,并且 `&` 绑定在变量上表示引用。 - 这种机制避免了拷贝指针带来的无法修改原变量的问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值