C++中 指针的指针是什么?指针的引用又是什么?你可能需要看看这篇文章
- 2022 年 4 月 20 日
- 笔记
关于变量的定义
我们都知道变量的定义包括一个基本数据类型(base type)和一组声明符,在同一条定义语句中,输入基本数据类型不同,但是声明符的形式却可以不同。
//如:i是一个int的整数,a是一个int型的指针,b是一个int型的引用
int i = 0 , *a = i , &b = i;
我们不需要太在意基本数据类型和类型修饰符的关系,后者只不过是前者声明符的一部分罢了。
定义多个变量
有很多人认为类型修饰符(如&和*)在定义中会作用于全部的函数,就是一次定义,一句中所有的变量使用(不得不说这样真方便,但是编译器不允许我们这样做)
//如这样 , 很正常的一次声明
int *p;
但是像下面这样一次声明两个却是错误的
int * p1 , p2
应该是这样才对
int *p1 , *p2;
指向指针的指针
按照逻辑来说,C++中并没有限制声明符中修饰符的个数,我们只需要按照其逻辑去加以解读即可。像指针,指针是内存中的对象,当然也可以像其他对象一样对它将它的地址再放到另一个指针当中。
int *p; //指针
int **p; //指向指针的指针
int ***p; //指向指针的指针的指针
它们的关系图如下:
一般int指针解引用时,会得到一个int的数。解引用指针的指针时也是一样,会得到一个指针。
指向指针的引用
引用(可以理解为一个变量的副本)本身不是一个对象,所以不存在指向引用的指针;但是指针是一个对象,所以它存在指向指针的引用。
int i = 10;
int *p; //p是一个int型的指针
int *&b = p; //b是一个指针的引用,它是对p的引用
b = &i; //b引用了一个指针,因此给b赋值&i就是令p指向i
*b = 0; //解引用b得到i ,也就是p指向的对象,将i的值改为0
1、p是一个int型的指针
2、b是一个指针的引用,它是对p的一个引用
3、b引用了一个指针,因此给b赋值&i就是令p指向i
4、解引用b得到i ,也就是p指向的对象,将i的值改为0
如何解读r呢?
直观的方法就是从左向右阅读,因为离变量名最近的修饰符对变量的类型有直接的影响。所以b是一个引用,但是却是一个指针的引用