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) 函式把陣列反轉(第一個和最後一個交換、第二個和倒數第二個交換...)。