什么情况下使用指针的引用
指针作为参数
先明确一下指针的概念,指针存放的是变量的地址。
在函数调用时用指针做参数,表示把变量的地址传递给子函数。但是子函数只能修改指针所指的变量的值,并不能修改指针的指向。
如果想要修改指针的指向,就要用指针的引用(指针的指针也可以,但是这里只谈指针的引用)。
例子
先拿最简单的main函数里的变量来举例子
#include <iostream>
using namespace std;
int main() {
int a = 4;
int b = 3;
//指针p存放a的地址
int* p = &a;
//再用指针s存放p中存放的东西
int *s = p;
//这时改变指针s,指针s存放b的地址
//思考一下,取指p,输出的是什么?
s = &b;
cout << *p;
return 0;
}
无疑取值p输出的结果是4,因为改变了指针s存放的变量地址,不会改变p存放的变量地址。
明确输出指针p和指针s改变前后存放的变量地址:
#include <iostream>
using namespace std;
int main() {
int a = 4;
int b = 3;
int* p = &a;
//更改为指针的引用
int* &s = p;
//这时改变指针s,指针s存放b的地址
//思考一下,取指p,输出的是什么?
s = &b;
cout << *p;
return 0;
}
这里的取值p也是3,因为指针s是引用,是p的别名,改变指针s存放的东西,实际上也是改变指针p存放的东西。
再深层一点解释,指针p和指针s都会有他自己的地址,结合例子1和2一起解释:
说完基本的,再说函数中的指针引用参数
#include <iostream>
using namespace std;
//传指针
void test(int* num) {
int a = 3;
num = &a;
}
int main() {
//指针s存放a的地址
int a = 4;
int* s = &a;
test(s);
//取值s输出是什么,思考一下
cout << *s << endl;
return 0;
}
结合开头说到的,函数传进去的是变量的地址,需要注意的是指针num和指针s不一样,只是存放的东西相同:
如果想操作指针s的指向,那就得传指针的引用到函数中
#include <iostream>
using namespace std;
//传指针的引用
void test(int* &num) {
int a = 3;
num = &a;
}
int main() {
//指针s存放a的地址
int a = 4;
int* s = &a;
test(s);
//取值s输出是什么,思考一下
cout << *s << endl;
return 0;
}
如果传指针的引用,取值s输出的是函数中改变后的值,3。