C++ 常量指针指向指向常量int的指针强制转换为指向常量int的指针指向指向常量int的指针

C++ 常量指针指向指向常量int的指针强制转换为指向常量int的指针指向指向常量int的指针,c++,pointers,c++11,casting,constants,C++,Pointers,C++11,Casting,Constants,代码如下: int *const *a = nullptr; int const *const *b = nullptr; b = a; 为什么这段代码编译和运行时没有错误?常量指针不是意味着我们不能更改它吗?实际上我的想法有一个错误:我认为b是const,因此无法分配给它。但是b是可修改的(尽管它指向的是const),因此可以分配给b 换句话说,int const*const*b不是const指针,但实际上是指向const指针的指针,因此它可以更改。b是指向const int的const指

代码如下:

int *const *a = nullptr;
int const *const *b = nullptr;

b = a;

为什么这段代码编译和运行时没有错误?常量指针不是意味着我们不能更改它吗?

实际上我的想法有一个错误:我认为
b
const
,因此无法分配给它。但是
b
是可修改的(尽管它指向的是
const
),因此可以分配给
b


换句话说,
int const*const*b
不是
const
指针,但实际上是指向
const
指针的指针,因此它可以更改。

b
是指向const int的const指针的指针。允许将其指定为指向(可写)的const指针int,因为如果要取消引用
*b
,则可以通读它

另一方面,
a=b
将无法编译,因为这将使指向(可写)int的指针指向const int,从而能够写入不应该写入的内容。类型系统可防止这种情况

当你还考虑到:

时,它会变得更有趣。
int const **c;
int **d;

练习:a、b、c和d之间允许哪些任务?为什么?< / P>你使用什么语言?我用C++语言,标准C++。11@TobySpeight这怎么不是答案呢?OP不明白发生了什么(因为它似乎违反了常量的正确性)。这就回答了问题(没有违反const正确性)。@Yakk我应该更仔细地阅读答案。你说得对。我认为混淆是关于类型兼容性;我没有想到混淆的是
int*const*const
。我收回了我的批评。
a=a
-可以,将指针分配给另一个指针,两个指针都指向同一类型
a=b
-失败(您已经解释过了)
a=c
-失败。我们还创建了指向常量int的可写int指针。
a=d
;-看起来不错。我们将它指定给最后一个指向
int*
的指针之后的所有内容,这似乎是正确的
b=a
-ok(您已经描述过了)
b=b
-ok。一种类型的指针指向同一类型的指针<代码>b=c-正常。一个常量类型的指针指向另一个可写类型的指针。我们仍然可以阅读<代码>b=d-正常。同上。继续另一条评论。
c=a
-失败。我们指定
c
指向int的指针,这样我们就可以改变const。糟糕<代码>c=b-失败。我们将“c”指定给指向非常量指针的指针,该指针可以更改(?对此不确定)<代码>c=c-正常。一种类型的指针指向同一类型的指针<代码>c=d-失败(?)。对此绝对不能肯定。它是否与通过
d
更改
int const
有关<代码>d=a-失败。我们可以改变指针,它是指向的和常量<代码>d=b-失败。与上面的示例相同<代码>d=c-失败(?)。还有一个理解上的问题,与
c=d
相同。不知道<代码>d=d-正常。很明显,实际上很容易把事情搞砸,我在理解指针时遇到了很多问题,没有看到任何独特的规则可以帮助解决所有问题:(