C++ 为什么这个指向常量指针的指针赋值是非法的?

C++ 为什么这个指向常量指针的指针赋值是非法的?,c++,pointers,constants,C++,Pointers,Constants,很难理解为什么这是非法的 编辑 谢谢你的回答。 以下是我对答案的解释,请随意不同意。 所以,错误在第三行。这意味着原始整数是常量,但并不意味着它指向的指针是常量,因此它是非法的,因为我们可以尝试通过“p1”更改指针“p”,这是不可能的,因为这是常量指针。所以要解决这个问题,第三行必须是: int x = 10; int * const p = &x; const int **p1 = &p; 这是因为它说,虽然原始整数是非常量(可变的),但它指向的指针是常量,因此它是一个合法的

很难理解为什么这是非法的

编辑

谢谢你的回答。 以下是我对答案的解释,请随意不同意。 所以,错误在第三行。这意味着原始整数是常量,但并不意味着它指向的指针是常量,因此它是非法的,因为我们可以尝试通过“p1”更改指针“p”,这是不可能的,因为这是常量指针。所以要解决这个问题,第三行必须是:

int x = 10;
int * const p = &x;
const int **p1 = &p;
这是因为它说,虽然原始整数是非常量(可变的),但它指向的指针是常量,因此它是一个合法的声明。所以这也是合法的:

int * const *p1 = &p;

这说明了同样的事情,除了它还说明您不能更改原始整数,因为它是常量。

您需要习惯指针声明的一点是,您需要尝试从右向左读取它们。重要的是
*

int*const p
表示
p
是指向非常量int的常量指针

const int**p1
表示
p1
是指向非常量指针的非常量指针

您的第二个声明失败,因为它从常量变量创建了一个非常量变量。

编译器(这里是gcc)告诉您

const int * const *p1 = &p;
原因是

p1是指向(
const
)指针的指针,指向
const
int

p是指向int的
const
指针


如果赋值是合法的,您可以通过
p1
修改
const
变量
p
(因为*p1的类型是
const int*
--指向const int的指针)。

声明两个常量:

invalid conversion from 'int* const*' to 'const int**' [-fpermissive]
声明无法通过指针更改其数据的指针:

int const x1 = 3;
const int x2 = 3;
声明无法更改为指向其他对象的指针:

const int *p = &someInt;
链接:

中的

int*const p=&x

这意味着地址/引用是恒定的,因为
常量在
*
之后(与目标值是恒定的相反,换句话说
常量在
*
之前,换句话说
常量int*p

const int**p1=&p

这意味着,
p1
,我将其称为“外部指针”,指向
const int*
,这是错误的,b.c.它应该指向前面表达式所述的
int*const

换句话说,正如编译器所说

int * const p = &someInt;

用literal
10
初始化新的可变
int
x
,很好:

error: cannot initialize a variable of type 'const int **' with an rvalue of type 'int *const *'
const int **p1 = &p;
int x = 10;
初始化新的常量指针,指向地址为
x
的可变
int
p
,精细:

error: cannot initialize a variable of type 'const int **' with an rvalue of type 'int *const *'
const int **p1 = &p;
int x = 10;

将新的可变指针初始化为指向地址为
p
的常数
int
的可变指针,由于剥离
常量
,以及由于添加最内部的
常量
而违反约束:

int * const p = &x;

或者直接在标准中,它们有点长。

您对
int*const p
的意图是什么?当出现错误消息时,您应该将其包含在问题中,通常它们已经给出了关于错误的提示wrong@tadman它实际上是相反的-
int*const p
创建一个指向可变值的常量指针,然后他试图得到一个指向常量值的可变指针。@VTT你解释得对。这个符号真的很不寻常,这就是为什么我感到困惑的原因。@tadman你可能想检查一下-它可以在不使用螺旋读取规则的情况下声明指针。几乎正确,根据你的最后一句话,这不应该起作用:
const int x=3;int y=x我理解你的意思,但即使这样也不起作用,而且似乎遵循这样的逻辑:
const int ci=42;常量int*常量p3=&ci;常数int**p=&p3在顶层,它是一个副本,所以常量不重要。“包裹在”指针或引用棒中的常量。获取某个对象的地址常量不能分配给持有某个非常量对象地址的对象,或者您可以通过仅通过非常量镜头(无投射)查看常量值来改变常量值。@ChrisUzdavinis是的,感谢您澄清我没有详细说明的地方此外,由于添加了最内部的常量,“添加常量应该不是问题,删除is@Slava它可能是,在这种情况下,这是一个问题。请参阅链接了解其实质。