c++ - 在 C 和 C++ 中使用 const 限定符指向数组的指针

标签 c++ c arrays pointers constants

考虑以下程序:

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 中也可以正常编译。那么,在上面的程序中发生了什么?

最佳答案

GCC-gnu

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 type const int (*)[5]. These types are incompatible in ISO C because the const 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,” where T 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 and arr2 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/

相关文章:

javascript - 访问多维 javascript 对象中的字符串子元素

c# - JSON.Net无法在自定义JsonConverter中反序列化json数组

php - 获取数组的第一个元素

c++ - 具有不可移动/可复制类型的 std::tuple

c - 释放其他类型的双指针时使用 void ** 是否安全?

c - Vigenere cs50 Pset2 末尾的额外字符

c - fftw 等 ionic 体物理学中的泊松

c++ - 为什么将 ‘float**’ 转换为 ‘const float**’ 时出现错误?

c++ - 按升序排列值的算法

c++ - 如何使用静态 ID 计数器初始化用户定义对象数组?