为啥我们不能定义一个指向 int 指针的低 + *** const 指针?

Posted

技术标签:

【中文标题】为啥我们不能定义一个指向 int 指针的低 + *** const 指针?【英文标题】:Why can we not define a low + top-level const pointer to a pointer to int?为什么我们不能定义一个指向 int 指针的低 + *** const 指针? 【发布时间】:2013-04-14 07:22:38 【问题描述】:

    定义 int 和指向 int 的指针:

    int i = 22, *p = &i;

    定义低级和***const指针:

    const int *const cp = p;

    (2) 没问题 - 无权更改 (of i) 值的 const 点

    定义一个指向low+top-level const的指针:

    const int **const cp_2_p = &p;

    (3) 不行,为什么?

    error C2440: 'initializing' : cannot convert from 'int **' to 'const int **const

我希望能够定义一个指向 int 的指针的指针,我无法更改它指向的地址,也无法更改它指向的地址。

【问题讨论】:

“高”和“低”级别指针是什么意思? 另请参阅here,了解为什么将int ** 转换为int const ** 是个坏主意。 @KirilKirov - 不是高低级指针 -> 高和/或低级常量;但我错了,它被称为“***”和“低级”;***意味着您不能更改地址。低级意味着您不能更改该地址中的值。 @zehelvion 你倒退了。低级 const 表示地址不能更改,*** const 表示值不能更改。 【参考方案1】:

通常,const 应用于其左侧的项目。 const T 的例外是由于历史原因而出现的,并且是 T const 的常规替代方案。

cp 被声明为一个 constant 指针,指向一个常量 int

cp_2_p 被声明为一个常量指针,指向一个 非常量 指向一个常量 int 的指针。

您需要像这样声明 cp_2_p 以使类型兼容:

const int *const *const cp_2_p

【讨论】:

或作为“const int *const *”,用于指向“const pointer to const int”的非常量指针。 @dascandy - 非常感谢,当涉及到指针的指针时,这确实掩盖了所有***低级 const “奥秘”。所以在 ** - 第一个 * 是指我指向的指针,第二个是我要声明的指针,对吗? @ArthurWulfWhite 是的,没错。从右到左阅读。这也是为什么“int const”在这方面稍微更正确的原因,它从右到左更容易阅读。 @dascandy 好吧,我又困惑了。我可以有一个指向非常量指针的常量指针,但我不能有一个指向常量值的非常量指针的常量指针? 不,当然可以。 "(1) int (2) * (3) * (4)" => (1) 和 (2) 是同一个位置,这就是 "int" 是否为 const。 (3) 表示指向int的指针是否为const。 (4) 指示指向 int 指针的指针是否为 const。您可以无限扩展列表,但通常不需要超过 2 个 *。顺便说一句,“volatile”也使用相同的位置。

以上是关于为啥我们不能定义一个指向 int 指针的低 + *** const 指针?的主要内容,如果未能解决你的问题,请参考以下文章

定义了一个常数组,为啥能用指针改变数组元素的值?

在C语言中能否直接给指针指向的数据赋值?为啥?

为啥指向函数的“const”指针不能在常量表达式中使用?

二维数组名不能赋值给二级指针- -

c语言char和int可以互相赋值,但指针不能赋值,char *和int *不能直接赋值,为啥呢?谢谢

当我们有常规数组时,为啥我们需要指向数组的指针?