Const限定符和数组

const qualifier and arrays

本文关键字:数组 Const      更新时间:2023-10-16

我正在学习c++,我对数组有疑问(我仍在研究这个主题,有些事情很清楚,而其他事情对我来说似乎仍然有点模糊)。我想知道这些声明是否合法,如果合法,它们如何影响新创建的数组:

让我们假设我想创建一个int型数组(为了保持简单):

我知道以下内容是合法的

int array[size];

,其中size为常量表达式

const int array[size];

这个声明意味着我可以读访问数组中的元素,但我不能给它们赋值(int a=array[2]是合法的,array[1]=10是错误的)。

那么像

这样的"顶层"const呢?
int const array[size];

const int const array[size];

它们首先是合法的吗?如果是这样,它们意味着什么?数组本身不是常量吗?不可能对数组进行赋值或复制初始化吗?

谢谢!

编辑:

我知道"顶级"answers"低级"const是什么意思(尽管我知道我可以把const限定符放在基本类型说明符之前和之后,这不会改变任何东西)。我想知道的是定义一个const数组(我的意思是不是一个const对象或变量的数组)是如何改变的。

以下两个语句有效且相等,

const int a[5]={1,2,3,4,5}; 
int const a[5]={1,2,3,4,5}; 

这是初始化常量数组的方法。

下面的声明给你一个语法错误。

const int const a[5];

根据c++标准限定符,const可以与除自身以外的任何类型说明符组合。这意味着在声明的类型说明符序列中只能有一个const限定符。类型说明符和限定符可以任意顺序组合。

可以用以下方式声明整型常量数组

const int array[size] = { /* list of initializers */ }; 
int const array[size] = { /* list of initializers */ }; 
const signed array[size] = { /* list of initializers */ }; 
signed const array[size] = { /* list of initializers */ }; 
signed const int array[size] = { /* list of initializers */ }; 
int const signed array[size] = { /* list of initializers */ }; 
const int signed array[size] = { /* list of initializers */ }; 
const signed int array[size] = { /* list of initializers */ }; 
int signed const array[size] = { /* list of initializers */ }; 
signed int const array[size] = { /* list of initializers */ }; 

所有的数组声明都是等价的。

注意常量对象在定义时必须初始化。

限定符const也可以出现在声明符中。例如,下面的声明声明了不同类型的对象

int const *p;
const int *p;
一方面

int * const p = new int;
const int * const p = new( 10 );
另一方面

*之后的第二个限定符const属于声明符。

也要考虑到,与c++相反,在C中限定符const可以在类型说明符序列中多次出现。多余的限定符将被忽略。

在C语言中,你可以写
const signed const int const array[size] = { /* list of initializers */ }; 

如果有指针,可以是const pointer:

const int *ptr = 5;

或指向的const值:

int* const ptr = 5;
指向const值的const指针:
const int* const ptr = 5;

数组是const指针,不能对整个数组重新赋值。下面的代码导致错误:

int array[5];
int secondArray[5];
secondArray = array;
所以定义数组const不应该改变数组的可访问性(它已经是const了)。你不能改变数组元素的可访问性。
int array[5];

相似的(不一样的):

const int *array = malloc(sizeof(int)*5);

然后代码:

array[2] = 3;

类似于:

*(array+2) = 3;

指针是const,但它的值不是。