什么情况下使用指针的引用

Posted wasi-991017

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么情况下使用指针的引用相关的知识,希望对你有一定的参考价值。

指针作为参数

先明确一下指针的概念,指针存放的是变量的地址。
在函数调用时用指针做参数,表示把变量的地址传递给子函数。但是子函数只能修改指针所指的变量的值,并不能修改指针的指向。
如果想要修改指针的指向,就要用指针的引用(指针的指针也可以,但是这里只谈指针的引用)。

例子

先拿最简单的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。
技术图片

以上是关于什么情况下使用指针的引用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Kotlin 在片段中引用 RecyclerView 时出现空指针错误

为啥使用弱指针进行委托?

取消引用指向不完整类型的指针

我应该避免在现代 C++ 中引用指针还是在这种特殊情况下可以

Golang - 指针与引用

C++笔记--指针和引用