C++指针的引用(*&)详解:实现局部作用域外的指针修改
C++中指针用于间接访问内存,但在函数间传递指针时,默认采用值传递,导致无法直接修改原指针变量的地址。若需彻底改变指针指向,必须使用指针的引用(如 int* &x),它能以别名的形式在函数内部直接操控外部指针,解决树图算法中的节点连接问题。
指针与引用的基本区别
指针和引用都能提供对对象的间接访问,但二者有本质不同。引用是对象的别名,定义时必须初始化且不能为空;指针则是一个独立的变量,可以未初始化或为空。当设计逻辑不允许参数为空时,引用是更安全和直观的选择。
指针的引用语法(int * &x)容易让人困惑,其含义可拆解为两部分:int * 表示这是一个整型指针类型,而 & 表示对该指针变量本身进行引用操作。
第1步:理解局部修改的限制
在C++中,函数参数默认按值传递。如果将指针作为参数传入,函数接收到的是该指针的一个副本(拷贝)。修改这个副本只会影响局部栈帧内的临时变量,而不会改变主调函数中原有的指针地址。
以下代码展示了这一现象:
#include <stdio.h>
void swap(int* p1,int* p2) {
int* temp=p1;
p1=p2;
p2=temp;
printf("交换中:a=%d,b=%d \n",*p1,*p2);
printf("交换中(地址):p1=%d \n",p1);
printf("交换中(地址):p2=%d \n",p2);
}
int main() {
int a=1,b=3;
int *p1=&a,*p2=&b;
// 交换前
printf("交换前:a=%d,b=%d \n",*p1,*p2);
printf("交换前(地址):p1=%d \n",p1);
printf("交换前(地址):p2=%d \n",p2);
// 交换中
swap(p1,p2);
// 交换后
printf("交换后:a=%d,b=%d \n",*p1,*p2);
printf("交换后(地址):p1=%d \n",p1);
printf("交换后(地址):p2=%d \n",p2);
return 0;
}
执行结果如下:
交换前:a=1,b=3
交换前(地址):p1=6422028
交换前(地址):p2=6422024
交换中:a=3,b=1
交换中(地址):p1=6422024
交换中(地址):p2=6422028
交换后:a=1,b=3
交换后(地址):p1=6422028
交换后(地址):p2=6422024
从运行截图中可以看到,虽然在 swap 函数内部确实交换了指针指向的内容及局部地址,但当控制权返回到 main 函数后,原始变量 p1 和 p2 的地址并未发生改变。这就是所谓的“局部修改”。
第2步:利用指针引用实现全局修改
要在全局范围(即主调函数)内修改指针本身,需要让实参以“别名”的方式传递给形参。只需在形参类型中加入一个 & 符号即可。
在上述基础上添加 & 后的运行截图:
修改后的输出结果为:
交换前:a=1,b=3
交换前(地址):p1=6422044
交换前(地址):p2=6422040
交换中:a=3,b=1
交换中(地址):p1=6422040
交换中(地址):p2=6422044
交换后:a=3,b=1
交换后(地址):p1=6422040
交换后(地址):p2=6422044
此时可见,不仅中间过程被修改,返回主函数后 p1 和 p2 依然保持着新指向。这是因为函数参数不再是指针的拷贝,而是原始指针变量的引用。
总结与应用场景
指针的引用 (*&) 允许你在子函数中直接重定向外部的指针变量。这在数据结构操作中非常实用,例如二叉树的插入、链表节点的重新链接等需要动态修改根节点或指针指向的算法场景中,使用引用可以避免繁琐的双重指针(**)结构,使代码更加简洁清晰。
以上就是C++中指针的引用*&的具体使用详细内容,更多关于C++指针的引用*&内容请搜索本站以前的文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













