多个const限定符的含义是什么?

时间:2014-04-13 13:51:45

标签: c const declaration function-signature

代码:

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

我见过双重反射,之前也阻止了指针的修改。我第一次见到生命中的三重常数。想知道它的用途。

4 个答案:

答案 0 :(得分: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限定指针
它指向const合格char

答案 1 :(得分:14)

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

char*** foo;
像这样访问

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

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

const char *const *const *const foo;

然而,最好避免成为三星级程序员。

答案 2 :(得分: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

答案 3 :(得分:4)

foo返回pointer,其中constant pointer指向指向constant pointer的另一个constant char int bar; const char* const* const* ptr = foo(bar); 。看看spiral rule

*ptr

所以基本上你不能改变任何**ptr***ptr或{{1}}。