c - C中的双指针const正确性警告

标签 c const implicit-conversion qualifiers multiple-indirection

指向非常量数据的指针可以隐式转换为指向相同类型的常量数据的指针:

int       *x = NULL;
int const *y = x;


在逻辑上,添加其他const限定符以匹配其他间接寻址应以相同的方式进行:

int       *      *x = NULL;
int       *const *y = x; /* okay */
int const *const *z = y; /* warning */


但是,使用GCC或带有-Wall标志的Clang进行编译会导致以下警告:

test.c:4:23: warning: initializing 'int const *const *' with an expression of type
      'int *const *' discards qualifiers in nested pointer types
    int const *const *z = y; /* warning */
                      ^   ~


为什么要添加附加的const限定词“丢弃嵌套指针类型中的限定词”?

最佳答案

const只能添加一个级别的原因很细微,并由Question 11.10 in the comp.lang.c FAQ解释。

简要地,请考虑与您的示例紧密相关的示例:

const int i;
int *p;
int const **z = &p;
*z = &i;
/* Now p points to i */


C通过仅允许分配在第一个指向级别上丢弃限定符来避免此问题(因此,此处不允许分配给z)。

您的确切示例不会遇到此问题,因为const第二级意味着无论如何都不允许分配给*z。在这种确切的情况下,C ++允许这样做,但是C的简单规则无法区分您的情况和上述示例。

关于c - C中的双指针const正确性警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9080343/

相关文章:

c++ - 针对 C++ 隐式转换的警告

我能否保证在 select() 报告套接字已准备好读取后 recv() 不会阻塞?

c - 指针在整个函数调用过程中保存信息

c++ - const关键字在C++函数原型(prototype)中意味着什么?

c - 在C编程中更新const

c++ - 为什么带有 unsigned long long 参数的 std::bitset 构造函数未标记为显式?

java - 用于列出源文件中所有函数的 linux 工具?

c - 上一行的结果(C 编程)

c# - C#-将变量标记为常量(只读)

java - 有没有办法在java中实现隐式类型转换或转换