C++ 数组
时间:2010-12-10 来源:charley_yang
1.
我们必须为数组指定一个大于等于 1 的维数,维数值必须是常量表达式—— 即:必须能在编译时刻计算出它的值 这意味着非 const的变量不能被用来指定数组的维数 ,下面的例子包含合法的和非法的数组定义
extern int get_size();
// buf_size 和 max_files 都是 const
const int buf_size = 512, max_files = 20;
int staff_size = 27;
// ok: const 变量
char input_buffer[ buf_size ];
// ok 常量表达式: 20 - 3
char *fileTable[ max_files - 3 ];
// 错误: 非 const 变量
double salaries[ staff_size ];
// 错误 非 const 表达式
int test_scores[ get_size() ];
说明:
虽然staff_size 被一个文字常量初始化 但是 staff_size 本身是一个非 const对象 系统只 能在运行时刻访问它的值 因此 它作为数组维数是非法的
另一方面 表达式 max_files - 3 是常量表达式 因为 max_files 是用 20 作初始值的 const变量 所以这个表达式编译 时刻被计算成 17
2.
数组可以被显式地用一组数来初始化 这组数用逗号分开 放在大括号中 例如
const int array_size = 3;
int ia[ array_size ] = { 0, 1, 2 };
被显式初始化的数组不需要指定维数值 编译器会根据列出来的元素的个数来确定数组的维数
// 维数为 3 的数组
int ia[] = { 0, 1, 2 };
如果指定了维数 那么初始化列表提供的元素的个数不能超过这个值 否则将导致编译错误 如果指定的维数大于给出的元素的个数 那么没有被显式初始化的元素将被置为 0
// ia ==> { 0, 1, 2, 0, 0 }
const int array_size = 5;
int ia[ array_size ] = { 0, 1, 2 };
字符数组可以用一个由逗号分开的字符文字列表初始化文字列表用花括号括起来,或者用一个字符串文字初始化 但是 注意这两种形式不是等价的,字符串常量包含一个额外的终止空字符 例如
const char ca1[] = { 'C', '+', '+' };
const char ca2[] = "C++";
cal的维数是3 ca2的维数是 4 下面的声明将被标记为错误
// 错误: "Daniel"是 7 个元素
const char ch3[ 6 ] = "Daniel";
5.
一个数组不能被另外一个数组初始化,也不能被赋值给另外一个数组,而且 C++不允许声明一个引用数组(即由引用组成的数组)
const int array_size = 3;
int ix, jx, kx;
// ok: 类型为 int*的指针的数组
int *iap [] = { &ix, &jx, &kx };
// 错误: 不允许引用数组
int &iar[] = { ix, jx, kx };
// 错误: 不能用另一个数组来初始化一个数组
int ia2[] = ia; // 错误
int main()
{
int ia3[ array_size ]; // ok
// 错误: 不能把一个数组赋给另一个数组
ia3 = ia;
return 0;
}
4.
要把一个数组拷贝到另一个中去必须按顺序拷贝每个元素,例如
const int array_size = 7;
int ia1[] = { 0, 1, 2, 3, 4, 5, 6 };
int main()
{
int ia2[ array_size ];
for ( int ix = 0; ix < array_size; ++ix )
ia2[ ix ] = ia1[ ix ];
return 0;
}
5.
任意结果为整数值的表达式都可以用来索引数组,例如
int someVal, get_index();
ia2[ get_index() ] = someVal;
但是用户必须清楚 C++没有提供编译时刻或运行时刻对数组下标的范围检查 除了程 员自己注意细节 并彻底地测试自己的程序之外 没有别的办法可防止数组越界 能够通 编译并执行的程序仍然存在致命的错误 这不是不可能的