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

C/C++數組操作實戰:排序、統計與全局/局部變量陷阱

     編輯:關於C語言

選擇排序實現解析

代碼演示了經典選擇排序:外層循環n-1輪,內層在未排序區尋找最小元素下標k,與當前位置i交換。

void sort(int array[], int n) {
    for (int i = 0; i < n - 1; ++i) {
        int k = i;
        for (int j = i + 1; j < n; ++j)
            if (array[j] < array[k]) k = j;
        if (k != i) {
            int t = array[k];
            array[k] = array[i];
            array[i] = t;
        }
    }
}

關鍵點:數組名作參數退化為指針int *array,**實參數組地址直接傳遞**,函數內修改影響原數組,**無拷貝開銷**。這是C語言高效處理大數據的基石。

統計計算:平均值、最大值、最小值

單次遍歷同時求三值,時間復雜度O(n),空間O(1)。

float count_avg(const float array[], int n, float *max, float *min) {
    float sum = array[0];
    *max = *min = array[0];
    for (int i = 1; i < n; ++i) {
        if (array[i] > *max) *max = array[i];
        if (array[i] < *min) *min = array[i];
        sum += array[i];
    }
    return sum / n;
}

改進點:用輸出參數(指針)返回多值,避免全局變量。原代碼用全局max/min耦合度高、線程不安全、可重入性差。

全局變量 vs 局部變量:深度剖析

原代碼問題

float max, min; // 全局變量
float count_avg(float array[], int score_num) {
    // 直接修改全局 max/min
    return avg;
}

四大弊端

  1. 生命周期過長:程序啟動到結束佔用存儲,非按需分配。
  2. 耦合與副作用:函數隱式依賴/修改外部狀態,**破壞函數純粹性**,導致難以測試、推理、並行。
  3. 命名空間污染:全局標識符易衝突,大型項目極其危險。
  4. 初始化順序陷阱:跨文件全局對象初始化順序未定義(C++更嚴重)。

正確姿勢

  • 優先局部變量:作用域最小化,棧分配極快,編譯器優化最佳。
  • 多值返回用結構體/指針/引用:
    // C: 輸出參數
    void stats(const float *a, int n, float *avg, float *max, float *min);
    
    // C++17: 結構化綁定
    struct Stats { float avg, max, min; };
    Stats stats(const std::vector<float>& v);
  • 必要時用靜態局部/文件靜態:static int counter; 限制可見範圍,保持狀態。
  • 常量用const/#define/enum:const float PI = 3.14159f; 有類型、作用域、可調試。

數組初始化規則差異

特性全局/靜態數組局部(自動)數組
默認初始化隱式零初始化**不初始化**(垃圾值)
显式初始化int a[5] = {1,2}; 剩餘為0同左,但C90不允許變長數組初始化
存儲區.data/.bss 段棧 (大小受限,通常1-8MB)
大數組風險無**棧溢出**,改用malloc/new/std::vector

現代C++替代方案

  • std::vector<T>:動態數組,RAII,邊界檢查at(),算法庫std::sort/minmax_element/accumulate。
  • std::array<T, N>:定長數組封裝,棧上,無開銷,支持.size()、迭代器、結構化綁定。
  • std::span<T> (C++20):非擁有視圖,替代T*, size_t參數對,安全高效。
  • 範圍for:for (auto &x : v) 替代下標循環,消除越界風險。

總結

數組操作看似基礎,實則蘊含內存模型、函數設計、作用域規則、現代語言演進等核心思想。**拒絕全局變量、擁抱RAII、善用標準庫、理解底層機制**——這是從「會用」到「精通」的必經之路。

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