指向非常量数据的常量指针
Const pointer pointing to non-const data
考虑以下情况 1:
const int n = 5;
int* p = &n;
这是无效的,因为&n
是cont int*
类型,p
是int *
类型(类型不匹配错误)。
现在,考虑这种情况 2:
int k = 4;
int *const p = &k;
本例编译成功,没有报错。显然,p
是 int * const
类型,&k
是 int *
类型。在这种情况下,存在类型不匹配,但它是有效的。
问题:为什么第二种情况有效,即使存在类型不匹配?
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;
考虑以下情况 1:
const int n = 5;
int* p = &n;
这是无效的,因为&n
是cont int*
类型,p
是int *
类型(类型不匹配错误)。
现在,考虑这种情况 2:
int k = 4;
int *const p = &k;
本例编译成功,没有报错。显然,p
是 int * const
类型,&k
是 int *
类型。在这种情况下,存在类型不匹配,但它是有效的。
问题:为什么第二种情况有效,即使存在类型不匹配?
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;