在C語言程式設計中,指針是核心也是難點。透過指針操作陣列元素,不僅能提升執行效率,更能深入理解記憶體管理機制。本文將詳細解析如何運用指針算術與遍歷技巧,在整數陣列中尋找最大值與最小值。
演算法採用單次遍歷策略:以陣列首元素同時初始化最大值與最小值,隨後依序比對各元素,動態更新兩極值。時間複雜度為 O(n),空間複雜度 O(1),屬於原地演算法的經典範例。
#include <stdio.h>
void find_max_min(int *arr, int n, int *max_val, int *min_val) {
int *ptr;
*max_val = *min_val = *arr; // 以首元素初始化
for (ptr = arr; ptr < arr + n; ptr++) {
if (*ptr > *max_val) *max_val = *ptr;
else if (*ptr < *min_val) *min_val = *ptr;
}
}
int main(void) {
int numbers[10];
int max_num, min_num;
int i;
printf("請輸入 10 個整數:\n");
for (i = 0; i < 10; i++) {
scanf("%d", &numbers[i]);
}
find_max_min(numbers, 10, &max_num, &min_num);
printf("\n最大值 = %d;最小值 = %d\n", max_num, min_num);
return 0;
}
迴圈條件 `ptr < arr + n` 利用指針算術精確控制遍歷範圍。`arr + n` 指向陣列尾後一個位置(不可解參考),作為哨兵邊界,避免越界訪問。
使用 `else if` 結構而非兩個獨立 `if`,可在元素介於兩極值之間時跳過第二次比較,微幅優化分支預測效能。
採用輸出參數模式(`int *max_val, int *min_val`),避免全域變數污染,符合模組化程式設計原則,便於單元測試與複用。
若需同時獲得極值對應的索引位置,可在函式中額外維護 `max_idx`、`min_idx` 變數,更新極值時同步記錄當前指針偏移量(`ptr - arr`)。此技巧常用於排序演算法的分區步驟與統計分析模組。
指針操作陣列尋找極值,展示了 C 語言「零成本抽象」的精髓:贴近硬體的記憶體模型、靈活的指針算術、極致的執行效率。掌握此模式,不僅能解決基礎算法題,更能為後續學習資料結構、系統程式打下堅實基礎。