我们知道C语言中,对于函数参数的传指针操作本质上仍然是一个传值过程,只是将实参指针的值传递给了函数中的一个临时变量,实质上我们传入函数的只是一块内存的地址,而非指针本身。所以如果在函数中改变形参指针所指向的地址,实参指针的指向是不会被改变的。
如下图代码所示
void func(int *p)
{
int *n = new int;
*n = 3;
p = n;
}
int main() {
int n = 1;
int *p = &n;
cout<<*p<<endl;
func(p);
cout<<*p<<endl;
return 0;
}
运行结果
1
1
可见实参指针并没有被改变。
如果我们希望在函输中能够改变指针的指向,该怎么办呢?答案是使用指针的引用作为参数来传递。
void func(int *&p) //此处使用指针的引用
{
int *n = new int;
*n = 3;
p = n;
}
int main() {
int n = 1;
int *p = &n;
cout<<*p<<endl;
func(p);
cout<<*p<<endl;
return 0;
}
运行结果
1
3
可见实参的指向被改变了。