首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

C++ 陣列名稱作為函式參數的傳遞機制與實務

     編輯:更多程式設計知識

核心觀念:陣列名稱退化為指標

在函式參數列表中,T arr[]、T arr[N]、T* arr 三種寫法完全等價,編譯器皆視為 T*。因此:

  • 不傳遞陣列大小,形參不佔用額外記憶體
  • 實際傳遞的是首元素位址,形參與實參指向同一塊記憶體
  • 函式內修改元素會影響原陣列

一、一維陣列參數三種等價寫法

// 寫法 1:帶大小(僅作文件用,編譯器忽略)
float average(float score[10]);

// 寫法 2:空方括號(推薦,語意清晰)
float average(float score[]);

// 寫法 3:指標形式(本質相同)
float average(float* score);

二、經典範例:計算 10 位學生平均分

#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 元素陣列的指標

六、現代 C++ 替代方案

#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) 以獲得型別安全與表達力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved