const限定符和数组

时间:2015-08-13 06:37:02

标签: c++ arrays const

我正在学习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];
他们首先是合法的吗?如果是这样,他们是什么意思?不是一个数组常量本身,是不可能分配给一个数组或复制初始化一个?

谢谢!

编辑:

我知道什么"顶级"和"低水平" const意味着(虽然我知道我可以在基本类型说明符之前和之后放置const限定符,并且不会改变任何东西)。我想知道的是如何定义一个const数组(我的意思是不是一个const对象或变量数组)改变了事情。

3 个答案:

答案 0 :(得分:5)

以下两个陈述有效且相等,

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

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

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

以下声明给出了语法错误。

const int const a[5];

答案 1 :(得分:1)

根据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 */ }; 

答案 2 :(得分:0)

如果你有指针,它可以是常量指针

const int *ptr = 5;

或指向 const值的指针:

int* const ptr = 5;

指向const值的const指针

const int* const ptr = 5;

根据定义,数组是常量指针 - 您无法重新分配整个数组。下面的代码会导致错误:

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但它的值不是。