为什么这个指向常量指针的指针是非法的?

时间:2018-06-05 19:08:43

标签: c++ pointers const

int x = 10;
int * const p = &x;
const int **p1 = &p;

难以理解为什么这是非法的。

编辑

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

int * const *p1 = &p;

这是有效的,因为它表示虽然原始整数是非常量(可变),但它指向的指针是常量,因此它是一个合法的陈述。所以这也是合法的:

const int * const *p1 = &p;

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

5 个答案:

答案 0 :(得分:5)

你需要习惯使用指针声明,你需要尝试从右到左阅读它们。重要的是*

的每一方都有什么

int * const p表示p const指针非const int

const int **p1表示p1非常量指针非常量指针 const int

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

答案 1 :(得分:2)

使用文字int初始化新的可变x 10,罚款:

int x = 10;

将新的常量指针初始化为地址为int的可变p x,罚款:

int * const p = &x;

将可变指针初始化为指向常量int的可变指针,地址为p,由于剥离const导致约束违规,并且还添加了最内层{{1} }}:

const

Read the full rules on cppreference.com或直接在标准中,它们有点长。

答案 2 :(得分:1)

声明2个不变的整数:

int const x1 = 3;
const int x2 = 3;

声明一个指针,其数据无法通过指针进行更改:

const int *p = &someInt;

声明一个无法更改为指向其他内容的指针:

int * const p = &someInt;

链接:const int = int const?

答案 3 :(得分:0)

编译器(这里,gcc)告诉你

invalid conversion from 'int* const*' to 'const int**' [-fpermissive]

原因是

p1是指向const int

的指针(非const

p是指向int

const指针

如果作业合法,您可以修改const变量pp1(因为* p1的类型为const int * - 指向const int的指针)。

答案 4 :(得分:0)

int * const p = &x;

这意味着地址/引用是常量,因为const位于*之后(而不是目标值保持不变,换句话说const位于*之前},换句话说const int *p

const int **p1 = &p;

这意味着,p1,我称之为"外部指针"指向const int *,这是错误的,b.c。它应该指向前一个表达式所指的int *const

换句话说,就像编译器所说的那样,

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