聲明了一個 int 型對象 而如下形式
int ia[10];
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 };
字元數組可以用一個由逗號分開的字元文字列表初始化文字列表用花括弧括起來,或者用一個字串文字初始化 但是 注意這兩種形式不是等價的,字串常量包含一個額外的終止Null 字元 例如
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++沒有提供編譯時間刻或運行時刻對數組下標的範圍檢查 除了程 員自己注意細節 並徹底地測試自己的程式之外 沒有別的辦法可防止數組越界 能夠通 編譯並執行的程式仍然存在致命的錯誤 這不是不可能的