为啥我们不能定义一个指向 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 指针?的主要内容,如果未能解决你的问题,请参考以下文章