6.3 陣列的初始化

宣告陣列時可以同時指定初值,避免後來訪問到未初始化的垃圾值。不同的初始化方式有不同的優缺點。

方式 1:使用大括號指定初值

int a[5] = {1, 2, 3, 4, 5};    // 完整初始化
int b[5] = {10, 20};            // 前兩個設 10、20,其餘自動設 0
int c[5] = {};                  // 所有元素設 0

方式 2:省略陣列大小

int a[] = {1, 2, 3};            // 編譯器自動推斷大小為 3

方式 3:全域陣列自動初始化為 0

int a[1000];  // 全域宣告,所有元素自動為 0

int main() {
    int b[1000];  // 局域宣告,所有元素為未知(垃圾值)
}

方式 4:使用迴圈初始化

int a[20];
for (int i = 0; i < 20; i++) {
    a[i] = i + 1;              // 先宣告,後初始化
}

範例程式碼

#include<iostream>
using namespace std;
int main() {
    // 方式 1:宣告時初始化部分元素
    int a[5] = {10, 20, 30};

    // a[0]=10, a[1]=20, a[2]=30, a[3]=0, a[4]=0
    for (int i = 0; i < 5; i++) {
        cout << "a[" << i << "]=" << a[i] << '\n';
    }

    cout << "---\n";

    // 方式 2:宣告時全部初始化為 0
    int b[5] = {};

    // b[0]~b[4] 都是 0
    for (int i = 0; i < 5; i++) {
        cout << "b[" << i << "]=" << b[i] << '\n';
    }

    return 0;
}

執行結果:

a[0]=10
a[1]=20
a[2]=30
a[3]=0
a[4]=0
---
b[0]=0
b[1]=0
b[2]=0
b[3]=0
b[4]=0

動手試試看:在上面的程式碼中,把 int b[5] = {}; 改成 int b[5];(不初始化),執行看看。你會看到 b 陣列輸出垃圾值。想想看為什麼 a 陣列反而有明確的初值?