当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在C&C++中使用const限定符指向数组的指针》经验,为你挑选了1个好方法。

考虑以下计划:

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中编译.那么,上面的程序中发生了什么?



1> haccks..:

GCC-GNU

在GNU C中,带有限定符的数组的指针与指向其他限定类型的指针的工作方式类似.例如,type的值int (*)[5]可用于初始化类型的变量const int (*)[5].这些类型在ISO C中是不兼容的,因为const限定符正式附加到数组的元素类型而不是数组本身.

C标准说(部分:§6.7.3/ 9):

如果数组类型的规范包含任何类型限定符,则元素类型是合格的,而不是数组类型.[...]

现在看看C++标准(第3.9.3/5节):

[...]应用于数组类型的Cv限定符附加到底层元素类型,因此符号" cv T,"where T是数组类型,指的是元素是如此限定的数组.元素为cv-qualified的数组类型也被认为具有与其元素相同的cv-qualifications.[ 例如:

 typedef char CA[5];
 typedef const char CC;
 CC arr1[5] = { 0 };
 const CA arr2 = { 0 };

类型两者的arr1arr2"5常量字符阵列"阵列型被认为是合格const-.-endexample]

因此,初始化

const int (*p2)[9] = &array;  

是类型的分配指针阵列[9]的int指针常量的阵列[9] int.这不是类似于分配int *到一个const int *其中const被直接施加到所述输入指针指向对象.const int(*)[9]在C中,const应用于数组对象的元素而不是指针指向的对象的情况并非如此.这使得上述初始化不兼容.

此规则在C++中已更改.正如const应用于数组对象本身一样,赋值是在相同类型的指针int之间指向const数组[9]而不是指向数组[9]的int类型指针指向const数组[9]的指针int.


@TomKarzes;*你应该总是能够在一个指针目标上添加`const`,在任何级别*:[No. 不在C](http://c-faq.com/ansi/constmismatch.html).
我称之为ISO C中的一个错误.这没有任何意义.您应始终能够在任何级别将指针目标添加到"const".
@TomKarzes不,你不应该,例如`int**`和`const int**`之间众所周知的不兼容性(它们在C++中也是不兼容的).如果存在隐式转换,则可以在不使用强制转换的情况下写入const对象.
@TomKarzes的危害在于您可以编写修改const对象的代码(导致未定义的行为)并且不会得到任何编译器警告或错误.[见完全描述](http://c-faq.com/ansi/constmismatch.html)
@TomKarzes:在安全气囊存在之前,汽车很有用.我们要删除它们吗?
推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有