const 限定符和数组
const qualifier and arrays
我正在学习C++,我对数组有疑问(我还在研究这个话题,有些东西很清楚,有些东西对我来说仍然有点晦涩难懂)。
我想知道这些声明是否合法,如果合法,它们如何影响新创建的数组:
假设我想创建一个整数数组(为简单起见):
我知道以下是合法的
int array[size];
其中 size 是常量表达式
还有这个
const int array[size];
这个声明意味着我可以读访问数组中的元素,但我不能分配给它们(int a=array[2]
是合法的,array[1]=10
是错误的)。
"top level" 常量怎么样
int const array[size];
或
const int const array[size];
他们首先是合法的吗?如果是这样,它们是什么意思?本身不是数组常量,因为不可能分配给数组或复制初始化一个数组?
谢谢!
编辑:
我知道 "top level" 和 "low level" 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];
如果你有指针,可以是const pointer:
const int *ptr = 5;
或指向常量值的指针:
int* const ptr = 5;
或指向常量值的常量指针:
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 但它的值不是。
根据 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 */ };
我正在学习C++,我对数组有疑问(我还在研究这个话题,有些东西很清楚,有些东西对我来说仍然有点晦涩难懂)。 我想知道这些声明是否合法,如果合法,它们如何影响新创建的数组:
假设我想创建一个整数数组(为简单起见):
我知道以下是合法的
int array[size];
其中 size 是常量表达式
还有这个
const int array[size];
这个声明意味着我可以读访问数组中的元素,但我不能分配给它们(int a=array[2]
是合法的,array[1]=10
是错误的)。
"top level" 常量怎么样
int const array[size];
或
const int const array[size];
他们首先是合法的吗?如果是这样,它们是什么意思?本身不是数组常量,因为不可能分配给数组或复制初始化一个数组?
谢谢!
编辑:
我知道 "top level" 和 "low level" 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];
如果你有指针,可以是const pointer:
const int *ptr = 5;
或指向常量值的指针:
int* const ptr = 5;
或指向常量值的常量指针:
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 但它的值不是。
根据 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 */ };