代碼演示了經典選擇排序:外層循環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耦合度高、線程不安全、可重入性差。
float max, min; // 全局變量
float count_avg(float array[], int score_num) {
// 直接修改全局 max/min
return avg;
}
// 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 |
std::vector<T>:動態數組,RAII,邊界檢查at(),算法庫std::sort/minmax_element/accumulate。std::array<T, N>:定長數組封裝,棧上,無開銷,支持.size()、迭代器、結構化綁定。std::span<T> (C++20):非擁有視圖,替代T*, size_t參數對,安全高效。for (auto &x : v) 替代下標循環,消除越界風險。數組操作看似基礎,實則蘊含內存模型、函數設計、作用域規則、現代語言演進等核心思想。**拒絕全局變量、擁抱RAII、善用標準庫、理解底層機制**——這是從「會用」到「精通」的必經之路。