指向非常量数据的常量指针

Const pointer pointing to non-const data

考虑以下情况 1:

const int n = 5;
int* p = &n; 

这是无效的,因为&ncont int*类型,pint *类型(类型不匹配错误)。

现在,考虑这种情况 2:

int k = 4;
int *const p = &k; 

本例编译成功,没有报错。显然,pint * const 类型,&kint * 类型。在这种情况下,存在类型不匹配,但它是有效的。

问题:为什么第二种情况有效,即使存在类型不匹配?

In this case, there is a type mismatch

否;在这种情况下没有类型不匹配。它是指向非成本的指针,您使用指向非常量的指针对其进行初始化。

或者,如果您坚持认为存在“不匹配”,则类似于以下“不匹配”:

const int b = 42;

Why is the second case valid

简单地说:初始化器的常量性与它是否初始化一个const对象无关。此外,初始化程序是非class类型的纯右值,因此 const 限定甚至不适用于它。

首先,int *const 确实表示指向非常量 int 的 const 指针。所以指针和指针类型之间绝对没有类型不匹配。

其次,您始终可以将非常量变量的地址转换为指向常量的指针。所以这也是有效的:

int n = 5;
const int * p = &n;