在函式參數列表中,T arr[]、T arr[N]、T* arr 三種寫法完全等價,編譯器皆視為 T*。因此:
// 寫法 1:帶大小(僅作文件用,編譯器忽略)
float average(float score[10]);
// 寫法 2:空方括號(推薦,語意清晰)
float average(float score[]);
// 寫法 3:指標形式(本質相同)
float average(float* score);
#include <cstdio>
float average(float arr[], int n) { // 明確傳遞長度,避免魔術數字
float sum = 0;
for (int i = 0; i < n; ++i) sum += arr[i];
return sum / n;
}
int main() {
float score[10];
puts("請輸入 10 位學生分數:");
for (int i = 0; i < 10; ++i) scanf("%f", &score[i]);
printf("平均分 = %.2f\n", average(score, 10));
return 0;
}
透過額外參數傳遞長度,單一函式可處理不同大小陣列:
float average(float arr[], int n) { /* 同上 */ }
int main() {
float classA[5] = {98.5, 97, 91.5, 60, 55};
float classB[10] = {67.5, 89.5, 99, 69.5, 77, 89.5, 76.5, 54, 60, 99.5};
printf("A 班平均 = %.2f\n", average(classA, 5));
printf("B 班平均 = %.2f\n", average(classB, 10));
}
// 正確:第二維大小固定
void printMatrix(int mat[][4], int rows); // 或 int (*mat)[4]
// 錯誤:int mat[][]、int** mat(除非動態配置指標陣列)
呼叫範例:
int data[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
printMatrix(data, 3);
| 誤區 | 說明 | 正確做法 |
|---|---|---|
在函式內用 sizeof(arr) 取得陣列大小 | 退化為指標後,sizeof 僅回傳指標大小(4/8 bytes) | 額外傳遞長度參數,或改用 std::vector/std::array |
| 嘗試在函式內重新指定陣列指標 | arr = new float[20]; 僅改變區域指標,不影響呼叫端 | 若需動態配置,回傳新指標或使用智慧指標 |
| 混淆「陣列指標」與「指標陣列」 | int (*p)[4] vs int* p[4] | 閱讀宣告時由內而外:(*p)[4] 是指向 4 元素陣列的指標 |
#include <vector>
#include <numeric> // accumulate
#include <iostream>
double average(const std::vector& v) {
return std::accumulate(v.begin(), v.end(), 0.0) / v.size();
}
int main() {
std::vector scores = {98.5, 97, 91.5, 60, 55};
std::cout << "平均 = " << average(scores) << '\n';
}
優點:自帶大小、支援動態擴充、配合演算法庫、避免手動記憶體管理。
理解「陣列名稱在函式參數中退化為指標」是掌握 C/C++ 陣列傳遞的關鍵。傳統寫法需自行管理長度與生命週期,現代專案建議優先採用 std::vector、std::array 或 std::span (C++20) 以獲得型別安全與表達力。