C++ 不存在「陣列參數」。函式參數宣告為陣列時,實際類型退化為指標:
void avg(int a[12]); // 實為 int*
void avg(int a[]); // 實為 int*
void avg(int* a); // 明確寫法
編譯器忽略方括號內的大小,sizeof(a) 在函式內永遠等於指標大小(4/8 位元組)。
void avg(int (&a)[12]); // 僅接受 int[12]
// 編譯期檢查大小,sizeof(a) 正確回傳 48
template <size_t N>
void avg(int (&a)[N]); // 接受任意大小 int 陣列,N 自動推導
void avg_impl(int* a, size_t n); // 傳統實作
template <size_t N>
inline void avg(int (&a)[N]) { // 介面包裝
avg_impl(a, N); // 自動傳入大小
}
void proc(int a[10][20]); // 退化為 int (*)[20]
void proc(int (*a)[20]); // 等價,語意更明確
void proc(int a[][20]); // 推薦寫法:保留次維大小
只有第一維退化,第二維(及以上)大小保留於型別系統中。
void proc_impl(int* a, size_t rows, size_t cols);
template <size_t R, size_t C>
inline void proc(int (&a)[R][C]) {
proc_impl(&a[0][0], R, C);
}
int* 初始化 int(&)[N]。new int[n])傳給陣列參考參數。std::span (C++20) 或 std::vector/std::array。std::array / std::vector / std::span 作為參數,完全避免退化問題。[[deprecated]] 標記舊式指標介面,推動遷移。