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

指针作为参数

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

例子

先拿最简单的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。

posted @ 2020-05-04 16:22  肥斯大只仔  阅读(494)  评论(0编辑  收藏  举报