int x = 10;
int * const p = &x;
const int **p1 = &p;
难以理解为什么这是非法的。
编辑
谢谢你们所有的好答案。 以下是我对答案的解释,随意不同意。 所以,错误在第3行。它意味着原始整数是常量但并不意味着它指向的指针是常量,因此它是非法的,因为我们可以尝试将指针“p”改变为“p1”,这是不可能的,因为这是一个常量指针。所以要解决这个问题,第三行必须是:
int * const *p1 = &p;
这是有效的,因为它表示虽然原始整数是非常量(可变),但它指向的指针是常量,因此它是一个合法的陈述。所以这也是合法的:
const int * const *p1 = &p;
这说同样的事情,除了它还说你不能改变原始整数,因为它是常数。
答案 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;
答案 3 :(得分:0)
编译器(这里,gcc)告诉你
invalid conversion from 'int* const*' to 'const int**' [-fpermissive]
原因是
p1是指向const
int
const
)
而
p是指向int
的const
指针
如果作业合法,您可以修改const
变量p
到p1
(因为* 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;