語法書 / AA 競程語法書 上冊 / 第七單元 / 把陣列當作函式參數

7.5 把陣列當作函式參數

很多時候你需要寫一個函式來處理陣列(例如求和、排序)。要理解陣列傳入函式時的特殊行為。

陣列傳入函式時有一個特殊性質:即使用 pass by value,函式內修改陣列元素也會影響外面的原陣列。這不同於基本型態的 pass by value 行為。

一維陣列參數格式:

void functionName(int arr[])

中括號裡可以寫陣列大小,但會被編譯器忽略(因為陣列退化成指標了,編譯器無法知道陣列的大小)。

多維陣列參數格式:

void functionName(int arr[][4][5])  // 第一維可以省略,第二維以後必須寫上

範例程式碼

範例 1:一維陣列的修改會影響外面

#include<iostream>
using namespace std;

// 把陣列的第一個元素改成 100
void modifyArray(int arr[]) {
    arr[0] = 100;  // 修改陣列,會影響外面的原陣列
}

int main() {
    int a[3] = {1, 2, 3};
    cout << "Before: " << a[0] << "\n";  // 輸出 1

    modifyArray(a);

    cout << "After: " << a[0] << "\n";  // 輸出 100

    return 0;
}

執行結果:

Before: 1
After: 100

範例 2:陣列求和函式

#include<iostream>
using namespace std;

// 計算陣列的總和(但這個函式不知道陣列的大小!)
// 所以必須把大小當作參數傳進來
int arraySum(int arr[], int n) {
    int sum = 0;
    for (int i = 0; i < n; i++) {
        sum += arr[i];
    }
    return sum;
}

int main() {
    int a[5] = {1, 2, 3, 4, 5};
    cout << "Array sum: " << arraySum(a, 5) << "\n";  // 輸出 15

    int b[3] = {10, 20, 30};
    cout << "Array sum: " << arraySum(b, 3) << "\n";  // 輸出 60

    return 0;
}

執行結果:

Array sum: 15
Array sum: 60

多維陣列的傳遞

#include<iostream>
using namespace std;

// 傳遞二維陣列:必須指定除了第一維外的所有維度大小
void print2D(int arr[][3], int rows) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < 3; j++) {
            cout << arr[i][j] << " ";
        }
        cout << "\n";
    }
}

int main() {
    int a[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };

    print2D(a, 2);

    return 0;
}

執行結果:

1 2 3
4 5 6

動手試試看:寫一個 void reverse(int arr[], int n) 函式把陣列反轉(第一個和最後一個交換、第二個和倒數第二個交換...)。