19

代码:

const char* const* const* foo(int bar);

我之前也看到过双重常量,它也阻止了指针的修改。我一生中第一次看到三重常量。想知道它的用途是什么。

4

4 回答 4

18

在您的示例中,除了顶级间接之外,所有的都是const合格的。

const char            /* const qualified base level */
    *const            /* const qualified level 1 */
    *const            /* const qualified level 2 */
    *                 /* regular level 3 */
    foo(int bar);

foo是一个接受int参数并返回常规指针的函数。
它返回的指针指向一个const限定指针
,该指针又指向另一个 指向限定的const限定指针
constchar

于 2014-04-13T13:58:21.883 回答
14

如果你有一个多级指针,你有几个指针变量。例子:

char*** foo;

像这样访问:

| foo | pointer1 | pointer2 | string |
   |    ^     |    ^     |    ^
    \___/      \___/      \___/

您可以将内存中的四个位置中的每一个都限定为 is const,如在声明中一样

const char *const *const *const foo;

但是,最好避免成为三星级程序员。

于 2014-04-13T14:00:48.450 回答
8

哈- 周围的混乱const

基本上,如果它限定一个指针,那么它适用于紧靠其左侧的指针。例如:

char *const c;

生成一个c指向 的只读指针char,而

const char *c;

创建c一个指向只读的指针char,但您可以更改c指向的位置。

当然,指针及其指向的内容都可以设为只读:

const char *const c;

这使c只读指针指向只读的char. 使用前一个声明,您可以修改*c,但不能修改c(即您不能使其指向其他地方)。使用第二个,您可以分配给c但不能分配给*c,使用第三个,您不能修改它指向的位置,也不能修改指向的对象。

这扩展到多个间接级别。对于您的情况,您可能希望const使用符合条件的匹配指针重新组合关键字。这主要是一个空格问题,但它会是这样的:

const char *const *const *foo(int bar);

这使得foo返回一个指向只读指针的指针,指向一个只读指针的只读指针char。仔细阅读:注意给定这段代码:

const char *const *const *ptr = foo(0);

然后你知道赋值ptr是合法的,但任何其他赋值都是非法的,即你不能赋值给*ptr**ptr***ptr

于 2014-04-13T13:56:34.433 回答
4

foo返回pointer指向 a 的 aconstant pointer指向另一个constant pointer指向 a 的 a constant char。看看螺旋法则

int bar;
const char* const* const* ptr = foo(bar);

所以基本上你不能改变任何*ptror**ptr***ptr

于 2014-04-13T13:56:14.223 回答