考虑以下程序:
int main()
{
int array[9];
const int (*p2)[9] = &array;
}
它在 C++ 中编译良好(参见现场演示 here),但在 C 中编译失败。默认情况下,GCC 会给出以下警告。 (见现场演示 here)。
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 中也可以正常编译。那么,在上面的程序中发生了什么?
最佳答案
In GNU C, pointers to arrays with qualifiers work similar to pointers to other qualified types. For example, a value of type
int (*)[5]
can be used to initialize a variable of typeconst int (*)[5]
. These types are incompatible in ISO C because theconst
qualifier is formally attached to the element type of the array and not the array itself.
C 标准说(部分:§6.7.3/9):
If the specification of an array type includes any type qualifiers, the element type is so- qualified, not the array type.[...]
现在看看 C++ 标准(第 3.9.3/5 节):
[...] Cv-qualifiers applied to an array type attach to the underlying element type, so the notation “
cv T
,” whereT
is an array type, refers to an array whose elements are so-qualified. An array type whose elements are cv-qualified is also considered to have the same cv-qualifications as its elements. [ Example:typedef char CA[5]; typedef const char CC; CC arr1[5] = { 0 }; const CA arr2 = { 0 };
The type of both
arr1
andarr2
is “array of 5 const char,” and the array type is considered to be const- qualified. —endexample]
因此,初始化
const int (*p2)[9] = &array;
将类型指向int
的数组[9]的指针分配给指向constint
的数组[9]的指针。这与将 int *
分配给 const int *
不同,其中 const
直接应用于指针指向的 object 类型。这不是 const int(*)[9]
的情况,在 C 中,const
应用于数组对象的元素而不是指针指向的对象至。这使得上述初始化不兼容。
此规则在 C++ 中已更改。由于 const
应用于数组对象本身,因此赋值是在相同类型 pointer to const array[9] of int
而不是类型 指向 int
的数组 [9] 的指针和 指向 const int
的数组 [9] 的指针。
关于c++ - 在 C 和 C++ 中使用 const 限定符指向数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34488559/