指针引用const null值

Pointer to reference to const null value

本文关键字:null const 引用 指针      更新时间:2023-10-16

这是代码:

const int   x = 0;
const int&  r = x;
const int*  p1 = x;  // Works (p1 = 0)
const int*  p2 = r;  // error C2440: 'initializing': cannot convert from 'const int' to 'const int *'

为什么p1设置为x的值,而不是p2?

是因为P2不能保证X仅通过查看R?
还是对引起此错误的参考有其他微妙的信息?

第三行应引起错误。它不在VS2015中,因为编译器或标准中的错误,具体取决于应用标准。其他编译器确实会发出有关此行的错误消息。

在C 11之前,任何评估为0的积分常数表达式都被视为 null指针常数,因此第一行等于 const int* p1 = NULL;指向x 。

由于C 14不再是这种情况。粗略地说,只有字面的零和nullptr是有效的空指针常数。

在两者之间,即在C 11中,该标准实际上允许评估为零的常数表达式被视为零指针常数。这被认为是标准中的缺陷。它固定在C 14中。一些编译器(GCC,Clang)选择立即修复缺陷,即使在C 11模式下也会报告错误。VS2015没有。

第四行在任何版本的C 中从未有效,因为r的类型是参考,而不是整数。

指针代表一个值的地址,因此要初始化您的指针,应使用"地址"操作员:&

const int *p1 = &x;
const int *p2 = &r;

您可以将指针设置为0(这不是PC上的有效地址),因为这与将其设置为NULL