指向const null值的指针

时间:2016-11-27 12:42:18

标签: c++ pointers reference const

这是代码:

{{1}}

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

是因为p2不能仅仅通过查看r来保证x是常数吗? 或者引用此错误的引用还有其他细微之处吗?

2 个答案:

答案 0 :(得分:3)

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

在C ++ 11之前,任何求值为0的整数常量表达式都被视为空指针常量,因此第一行等同于 { "compilerOptions": { "outDir": "./built/", "sourceMap": true, "noImplicitAny": true, "module": "commonjs", "target": "es5", "types" : ["jquery", "lodash", "moment"] }, "files": [ "./src/require-config.ts", "./src/form.ts" ] } ,它不不要让p1指向x

从C ++ 14开始,情况就不再如此了。粗略地说,只有文字零和const int* p1 = NULL;是有效的空指针常量。

在两者之间,也就是说,在C ++ 11中,标准实际上允许将值为零的常量表达式视为空指针常量。这被视为标准中的缺陷。它是在C ++ 14中修复的。一些编译器(gcc,clang)选择立即修复缺陷并报告错误,即使在C ++ 11模式下也是如此。 VS2015没有。

第四行在任何版本的C ++中都不会有效,因为nullptr的类型是引用,而不是整数。

答案 1 :(得分:-1)

指针代表值的地址,因此要初始化指针,您应使用“address-of”运算符:&

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

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