C語言陣列一次性初始化方法|新手完整指南

1. 前言

C語言中「陣列的初始化」是程式設計上非常重要的概念。特別是,適當運用一次性初始化,可提升程式碼的可讀性,並防止錯誤。 本文將詳細說明在 C 語言中一次性初始化陣列的方法。從基本的陣列定義、多維陣列的初始化、memset 的使用方法,甚至 std::fill 等 C++ 的初始化手法,皆廣泛涵蓋。無論是初學者還是中階者,都能獲得實作性的知識,請務必閱讀至最後。

2. 陣列的基礎

2.1 陣列是什麼

陣列是指將相同類型的多筆資料儲存在連續的記憶體區域中的資料結構。例如,想要一次管理多個整數型 (int) 變數時,就會使用陣列。

2.2 陣列的宣告方式

在 C 語言中,陣列的宣告方式如下。
資料型 陣列名[元素數];
例如,若要定義一個可儲存 5 個整數的陣列,則可這樣寫。
int numbers[5];

2.3 陣列的記憶體配置與元素存取

陣列的元素可使用 從 0 開始的索引 來存取。以下程式碼說明如下。
#include <stdio.h>

int main() {
    int numbers[5] = {10, 20, 30, 40, 50};

    printf("%dn", numbers[0]); // 10
    printf("%dn", numbers[1]); // 20
    printf("%dn", numbers[4]); // 50

    return 0;
}
年収訴求

3. 陣列的初始化方法

3.1 個別初始化

將陣列的每個元素 逐一指定 來初始化的方法。
int numbers[5];
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
numbers[3] = 40;
numbers[4] = 50;

3.2 一次性初始化

在宣告時 一次性指定值 來初始化的方法。
int numbers[5] = {10, 20, 30, 40, 50};
此外,也可以省略陣列的大小。
int numbers[] = {10, 20, 30, 40, 50};
在此情況下,編譯器會自動根據初始化清單的元素數量來決定大小

3.3 部分初始化

如果在初始化清單中只指定部分元素,未指定的部分會 自動以 0 填補
int numbers[5] = {10, 20}; // 剩餘的元素會變成 0

4. 以特定值進行批次初始化

4.1 memset 函式的使用

memset以位元組為單位填充記憶體的函式。例如,將陣列全部初始化為 0 時很方便。
#include <stdio.h>
#include <string.h>

int main() {
    int numbers[5];
    memset(numbers, 0, sizeof(numbers));

    for (int i = 0; i < 5; i++) {
        printf("%d ", numbers[i]); // 0 0 0 0 0
    }

    return 0;
}

4.2 使用 for 迴圈的初始化

使用迴圈時,無論任何值都能初始化陣列的所有元素。
int numbers[5];

for (int i = 0; i < 5; i++) {
    numbers[i] = 100; // 將所有元素設為 100
}

4.3 C++ 中 std::fill 的使用

在 C++ 中,使用 std::fill 可以更簡潔地進行初始化。
#include <iostream>
#include <algorithm>

int main() {
    int numbers[5];
    std::fill(numbers, numbers + 5, 100); // 將所有元素設為 100

    for (int i = 0; i < 5; i++) {
        std::cout << numbers[i] << " "; // 100 100 100 100 100
    }

    return 0;
}

5. 多維陣列的初始化

5.1 2維陣列的宣告與初始化

基本結構

int matrix[3][3];

一次性初始化

int matrix[3][3] = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

5.2 memset 進行多維陣列的初始化

#include <stdio.h>
#include <string.h>

int main() {
    int matrix[3][3];
    memset(matrix, 0, sizeof(matrix)); // 將整個陣列填滿0

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", matrix[i][j]); // 輸出全部 0
        }
        printf("n");
    }

    return 0;
}

6. 初始化時的注意事項與最佳實踐

6.1 未初始化陣列導致的錯誤

C語言中,局部變數(堆疊區域的變數)預設不會被初始化
#include <stdio.h>

int main() {
    int numbers[5]; // 未初始化

    for (int i = 0; i < 5; i++) {
        printf("%d ", numbers[i]); // 可能輸出未定義的值
    }

    return 0;
}
解決方案:
int numbers[5] = {0}; // 以 0 初始化所有元素

6.2 memset 的適用範圍

#include <stdio.h>
#include <string.h>

int main() {
    int numbers[5];
    memset(numbers, 0, sizeof(numbers)); // 初始化為全 0

    for (int i = 0; i < 5; i++) {
        printf("%d ", numbers[i]); // 0 0 0 0 0
    }

    return 0;
}

6.3 可讀性與可維護性的提升

int matrix[3][3] = {
    { 1,  2,  3},
    { 4,  5,  6},
    { 7,  8,  9}
};

7. FAQ(常見問題)

7.1 memset 可以設定任意的值嗎?

int numbers[5];
memset(numbers, 5, sizeof(numbers)); // 這是錯誤!
正確的方法
for (int i = 0; i < 5; i++) {
    numbers[i] = 5;
}

7.2 可以用 memset 初始化多維陣列嗎?

int matrix[3][3];
memset(matrix, 0, sizeof(matrix));

7.3 如何一次性初始化結構體陣列?

struct Point {
    int x;
    int y;
};

struct Point points[3] = {
    {1, 2},
    {3, 4},
    {5, 6}
};

8. 總結

8.1 主要要點回顧

  • 不要在未初始化的情況下使用局部變數的陣列!
  • 確認初始化列表的大小與陣列的大小是否相符
  • 全域變數與靜態變數預設會初始化為 0
  • memset 使用於整數型陣列時需小心
  • 大型陣列適合使用 for 迴圈進行初始化

8.2 程式碼範例:適當的初始化實踐

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    // 一次性初始化
    int arr1[5] = {1, 2, 3, 4, 5};

    // 使用 memset 進行零初始化
    int arr3[5];
    memset(arr3, 0, sizeof(arr3));

    // 使用 for 迴圈進行初始化
    int arr4[5];
    for (int i = 0; i < 5; i++) {
        arr4[i] = i * 10;
    }

    // 顯示結果
    printf("arr1: ");
    for (int i = 0; i < 5; i++) printf("%d ", arr1[i]);
    printf("n");

    printf("arr3: ");
    for (int i = 0; i < 5; i++) printf("%d ", arr3[i]);
    printf("n");

    printf("arr4: ");
    for (int i = 0; i < 5; i++) printf("%d ", arr4[i]);
    printf("n");

    return 0;
}

8.3 最後

配列的初始化是左右程式穩定性的重要因素。透過適當的初始化,能夠寫出防止錯誤、具高可讀性的程式碼。 請務必將本次學到的內容實際寫入程式碼並加以測試!
侍エンジニア塾