void func(int*& p) {
*p = 100;
}
int a = 5;
int* ptr = &a;
func(ptr);
cout << a;
✅ 输出:100
解析
int*& p:指针的引用,p是实参ptr的别名。
ptr存放变量a的地址。- 调用
func(ptr),形参p引用ptr,p和ptr是同一个指针。 *p = 100;:对p指向的内存赋值,也就是修改a的值,a变成100。- 输出a得到100。
区分三组写法(CSP难点)
void func(int *p)//指针传值:p是副本,拷贝ptr里的地址
void func(int* p){
*p = 100; //依然可以修改a的值,解引用修改指向内容
}
这种也能改a;但p = nullptr; 只会修改副本,外面ptr不变。
void func(int*& p)//指针的引用,p就是外面ptr本身
void func(int*& p){
*p = 100;
p = nullptr; //会把外部ptr直接置空!
}
void func(int &p)//int变量的引用,接收int变量,不能传指针ptr。
关键记忆
int*& p读作:对int型指针的引用*p修改的是指针指向的内容;- 如果写
p = xxx;,修改的是指针本身(存的地址)。
变式思考题
void func(int*& p) {
p = nullptr;
}
int a =5;
int* ptr = &a;
func(ptr);
//cout << *ptr; //这里运行直接崩溃,ptr变成空指针
小练习:下面代码输出多少?
void f(int *&q){ *q = 200; } int x=10; int *t = &x; f(t); cout << x;👉 答案:
200。

