[英]Pointer to array with const qualifier in C & C++
考虑以下程序:
int main()
{
int array[9];
const int (*p2)[9] = &array;
}
它在 C++ 中编译得很好(请参阅此处的现场演示)但在 C 中编译失败。默认情况下,GCC 给出以下警告。 (请参阅此处的现场演示)。
prog.c: In function 'main':
prog.c:4:26: warning: initialization from incompatible pointer type [enabled by default]
const int (*p2)[9] = &array;
但是如果我使用-pedantic-errors
选项:
gcc -Os -s -Wall -std=c11 -pedantic-errors -o constptr constptr.c
它给了我以下编译器错误
constptr.c:4:26: error: pointers to arrays with different qualifiers are incompatible in ISO C [-Wpedantic]
为什么它在 C 中编译失败但在 C++ 中没有? C & C++ 标准对此有何规定?
如果我在数组声明语句中使用const限定符,它也可以在 C 中正常编译。 那么,上面的程序中发生了什么?
在 GNU C 中,指向带有限定符的数组的指针的工作方式类似于指向其他限定类型的指针。 例如,
int (*)[5]
类型的值可用于初始化const int (*)[5]
类型的变量。 这些类型在 ISO C 中是不兼容的,因为const
限定符正式附加到数组的元素类型而不是数组本身。
C 标准说(部分:§6.7.3/9):
如果数组类型的规范包含任何类型限定符,则元素类型是如此限定的,而不是数组类型。[...]
现在看看 C++ 标准(第 3.9.3/5 节):
[...] 应用于数组类型的 Cv 限定符附加到底层元素类型,因此符号“
cv T
”(其中T
是数组类型)是指元素被如此限定的数组。 元素为 cv 限定的数组类型也被认为具有与其元素相同的 cv 限定。 [示例:typedef char CA[5]; typedef const char CC; CC arr1[5] = { 0 }; const CA arr2 = { 0 };
arr1
和arr2
的类型都是“5 个常量字符的数组” ,并且数组类型被认为是常量限定的。 —结束示例]
因此,初始化
const int (*p2)[9] = &array;
是将指向int
array[9]的类型指针分配给指向 const int
array[9] 的指针。 这与将int *
分配给const int *
,其中const
直接应用于指针指向的对象类型。 这不是const int(*)[9]
情况,在 C 中, const
应用于数组对象的元素而不是指针指向的对象。 这使得上述初始化不兼容。
此规则在 C++ 中有所更改。 作为const
被施加到阵列对象本身,该分配是相同类型的指针指向的数组常量[9]之间int
代替类型指针的阵列[9] int
和指针为const的阵列[9] int
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.