int ** const p的行为不像常量

时间:2015-07-15 07:12:16

标签: c++ c pointers

我们知道在int * const p中,p是一个常量指针 它意味着p保持的地址不能改变,但是在函数foo中我们改变地址。

怎么可能?

int main(){
    int i = 10;
    int *p = &i;
    foo(&p);
    printf("%d ", *p);
    printf("%d ", *p);
}
void foo(int **const p){
    int j = 11;
    *p = &j;
    printf("%d ", **p);
}

2 个答案:

答案 0 :(得分:2)

int **const p表示p不变。

不允许关注

p++; // Bad
p += 10; // Bad
p = newp; // Bad

但以下情况很好:

if(p) *p = some_p;
if(p && *p) **p = some_int;

如果您不想重新分配*p,请使用以下

int * const *p;

如果您不希望p*p变更,请使用:

int * const * const p;

以下内容将使所有p*p**p成为只读

  const int *const *const p;
//  1          2      3

1:**p是恒定的 2:*p是恒定的 3:p是常数

根据您的要求使用1或2或3或任意组合。

cdecl页面:如何阅读int ** const pconst int *const *const p等复杂声明

相关:c - what does this 2 const mean?

答案 1 :(得分:0)

在您的情况下,const本身适用于p,而不是* p** p。换句话说,您可以更改*p**p,但不能更改p

FWIW,尝试更改p并查看。

请参阅 LIVE