猿问

C中的双指针常量正确性警告

C中的双指针常量正确性警告

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


int       *x = NULL;

int const *y = x;

添加额外的const限定符以匹配额外的间接寻址应该在逻辑上以相同的方式工作:


int       *      *x = NULL;

int       *const *y = x; /* okay */

int const *const *z = y; /* warning */

-Wall但是,使用标志对GCC或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限定符“在嵌套指针类型中丢弃限定符”?


慕的地10843
浏览 493回答 2
2回答

POPMUISE

之所以const只能添加一个级别的原因是微妙的,并且在comp.lang.c FAQ中由问题11.10解释。简而言之,请考虑与您的密切相关的此示例:const int i;int *p;int const **z = &p;*z = &i;/* Now p points to i */C通过仅允许在第一个指向级别丢弃限定符来避免此问题(因此z不允许在此处进行赋值)。您的确切示例不会遇到此问题,因为const第二级意味着*z无论如何都不会允许分配。在这种情况下,C ++ 会允许它,但C的更简单的规则不区分你的情况和上面的例子。
随时随地看视频慕课网APP
我要回答