声明指向指针的指针是合法的。(c++标准:多级指针)
int *pi; //一级指针
int **ppi; //二级指针
int ***pppi;//三级指针
出现指向指针的指针的两种常见的情形:
第一种是声明一个指针数组时
Shape *picture[MAX];//一个数组,其元素为指向 Shape 的指针
由于数组的名字会退化为指向其首元素的指针,所以指针数组也是一个指向指针的指针
Shape ** pic1 = picture; //指向指针的指针为一个二级指针
多级指针的第二个常见的应用情形,是当一个函数需要改变传递给它的指针的值时。考虑下面函数,它将一个指针移动到指向字符串中的下一个字符:
void scanTo(const char **p, char c)
{
while(**p && **p != c)
++*p;
}
传递给scanTo的第一个参数是一个指向指针的指针,该指针值是我们希望改变。这意味着我们必须传递指针的值:
char s[] = "Hello, world";
cont char *cp = s;
scanTo(&cp, ',');//将CP移动到第一个‘,’出现的位置
这种用法在C语言里是合理的,但在C++里面,更习惯,更简单,更安全的做法是使用指向指针的引用作为参数,而不是使用指向指针的指针作为参数:
void scanTo(const char *&p, char c)
{
while(*p && *p != c)
++p;
}
char s[] = "Hello, world";
cont char *cp = s;
scanTo(cp, ',');
在C++中,几乎总是首选使用只想爱能指针的引用作为函数参数,而不是指向指针的指针。
一个指向派生类的指针可被转换为一个指向其公共基类的指针:
Circle *c = new Circle;
Shape *s = c;//挺好的
因为Circle是一个(is - a)Shape,因而一个指向Circle的指针也是一个Shape指针。然而,一个指向Circle指针的指针并不是一个指向Shape指针的指针:
Circle **cc = &c;
Shape **ss = &cc;//错误
同样,将一个指向非常量的指针转换为一个指向常量的指针是合法的,但不可以将一个指向“指向非常量的指针”的指针转换为一个指向“指向常量指针”的指针:
char *s1 = 0;
const char *s2 = s1;//没问题
char *a[MAX];//也就是cahr**
const char **ps = a;//错误