代码:
const char* const* const* foo(int bar);
我见过双重反射,之前也阻止了指针的修改。我第一次见到生命中的三重常数。想知道它的用途。
答案 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}}。