void func(int*& p) {
    *p = 100;
}
int a = 5;
int* ptr = &a;
func(ptr);
cout << a;

✅ 输出:100

解析

int*& p指针的引用,p是实参ptr的别名。

  1. ptr存放变量a的地址。
  2. 调用func(ptr),形参p引用ptrpptr是同一个指针。
  3. *p = 100;:对p指向的内存赋值,也就是修改a的值,a变成100。
  4. 输出a得到100。

区分三组写法(CSP难点)

  1. void func(int *p) //指针传值:p是副本,拷贝ptr里的地址
void func(int* p){
    *p = 100; //依然可以修改a的值,解引用修改指向内容
}

这种也能改a;但p = nullptr; 只会修改副本,外面ptr不变

  1. void func(int*& p) //指针的引用,p就是外面ptr本身
void func(int*& p){
    *p = 100;
    p = nullptr; //会把外部ptr直接置空!
}
  1. 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