Skip to content

陣列 (Array)

考慮以下情況:需要宣告存放 顆樹的高度,一種方式為宣告 個變數,這種方 C/C++ 支援陣列,可以將同性質的變數,利用索引值進行存取。

宣告和初始化

宣告語法為 type var[size]

  • type:資料的型態,可為 C/C++ 提供的 基礎資料型態 或是 自定義的結構
  • var:變數名稱
  • size:陣列大小,必須是數字或常數( C++const ),不可是變數,否則會在執行時發生錯誤。

在宣告時期,陣列內的元素是未被初始化的,在宣告的階段,可以利用 initializer_list 初始化, initializer_list 的格式為 {val1, val2, val3, ...} 。使用這種方式,一開始所有元素的值都會先設為 ,再將 initializer_list 的值依序放入陣列, initializer_list 的元素可以小於陣列長度,未被更動的元素會保持為 initializer_list 只可以用在宣告時,不可在宣告後使用:

1
2
3
4
5
6
7
const int SIZE = 100;
int num;
int arr1[100];            // OK
int arr2[SIZE];           // OK
int arr3[num];            // 錯誤,不可使用變數設定大小。
int arr4[10] = {1, 2, 3}; // 使用 initializer_list。
arr1 = {1, 2, 3}; // 錯誤,只可在宣告時使用 initializer_list。

存取

陣列存取須利用下標運算子 [][] 需放索引值(Index),索引值為整數,從 開始,一個長度為 的陣列,它的索引值是從 ( )。如果索引值超過範圍,會發生錯誤或意想不到的事情,例如:記憶體區段錯誤 (Segmentation fault),修改到其他變數。

1
2
3
4
5
int arr[100];
for (int i = 0; i < 100; ++i)
{
    arr[i] = i;
}

多維陣列

C/C++ 支持多維陣列,即陣列裡有陣列,以二維陣列為例:

1
2
3
4
5
6
7
8
int arr[10][10];             // 宣告
for (int i = 0; i < 10; ++i) // i 代表第一維的索引值
{
    for (int j = 0; j < 10; ++j) // j 代表第二維的索引值
    {
        arr[i][j] = i * 10 + j;
    }
}

陣列常見問題:記憶體過大

C/C++ 會遇到陣列開在 main 裡面記憶體會過大,導致程式無法情形,有兩種方法可以解決:

  • 將陣列開在全域
  • 在變數前加入 static 關鍵字
1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;
int arr1[100000]; // OK,開在全域

int main()
{
    int arr2[100000];        // 錯誤,記憶體過大
    static int arr3[100000]; // OK,加上 static 關鍵字
}