首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 必知必會 (六):陣列參數傳遞的本質與現代解法

     編輯:關於C++

核心真相

C++ 不存在「陣列參數」。函式參數宣告為陣列時,實際類型退化為指標:

void avg(int a[12]);   // 實為 int*
void avg(int a[]);     // 實為 int*
void avg(int* a);      // 明確寫法

編譯器忽略方括號內的大小,sizeof(a) 在函式內永遠等於指標大小(4/8 位元組)。

保留陣列大小資訊的正確姿勢

1. 陣列參考(C++ 核心準則推薦)

void avg(int (&a)[12]);  // 僅接受 int[12]
// 編譯期檢查大小,sizeof(a) 正確回傳 48

2. 模板推導陣列大小(泛化)

template <size_t N>
void avg(int (&a)[N]);   // 接受任意大小 int 陣列,N 自動推導

3. 結合傳統介面(尺寸分離)

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。

現代最佳實務

  1. 優先使用 std::array / std::vector / std::span 作為參數,完全避免退化問題。
  2. 必須對接 C 風格 API 時,採用「模板陣列參考包裝傳統函式」模式。
  3. 在標頭檔以 [[deprecated]] 標記舊式指標介面,推動遷移。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved