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

C語言指針實現求最大值與最小值完整教程

     編輯:關於C

前言

在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;
}

關鍵技術點解析

1. 指針遍歷邊界條件

迴圈條件 `ptr < arr + n` 利用指針算術精確控制遍歷範圍。`arr + n` 指向陣列尾後一個位置(不可解參考),作為哨兵邊界,避免越界訪問。

2. 雙極值同步更新

使用 `else if` 結構而非兩個獨立 `if`,可在元素介於兩極值之間時跳過第二次比較,微幅優化分支預測效能。

3. 函式介面設計

採用輸出參數模式(`int *max_val, int *min_val`),避免全域變數污染,符合模組化程式設計原則,便於單元測試與複用。

常見錯誤與避坑指南

  • 未初始化極值:直接宣告未賦值的區域變數會導致未定義行為,必須以首元素初始化。
  • 指針越界:寫成 `ptr <= arr + n` 會多解參考一次尾後位置,觸發段錯誤。
  • 忽略空陣列:實務專案中應在函式入口檢查 `n > 0`,防止空指針解參考。

進階延伸

若需同時獲得極值對應的索引位置,可在函式中額外維護 `max_idx`、`min_idx` 變數,更新極值時同步記錄當前指針偏移量(`ptr - arr`)。此技巧常用於排序演算法的分區步驟與統計分析模組。

總結

指針操作陣列尋找極值,展示了 C 語言「零成本抽象」的精髓:贴近硬體的記憶體模型、靈活的指針算術、極致的執行效率。掌握此模式,不僅能解決基礎算法題,更能為後續學習資料結構、系統程式打下堅實基礎。

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