指向指针的指针

声明指向指针的指针是合法的。(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;//错误
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值