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

C 指針編程之道:指針在排序與查找算法中的核心應用

     編輯:關於C

前言

指針是 C 語言操作內存、實現高性能算法的核心工具。本文通過直接選擇排序與二分查找兩個經典案例,展示指針算術、解引用、參數傳遞在算法中的實戰運用。

一、直接選擇排序:指針版

#include 

void select_sort(int *arr, int n) {
    for (int i = 0; i < n - 1; i++) {
        int *min_ptr = arr + i;  // 指向當前最小元素
        for (int j = i + 1; j < n; j++) {
            if (*(arr + j) < *min_ptr)  // 指針解引用比較
                min_ptr = arr + j;       // 更新最小元素指針
        }
        if (min_ptr != arr + i) {        // 需要交換
            int tmp = *min_ptr;
            *min_ptr = *(arr + i);
            *(arr + i) = tmp;
        }
    }
}

int main() {
    int a[10] = {12, 2, 37, 67, 90, 1, 78, 67, 2, 32};
    printf("Before: ");
    for (int i = 0; i < 10; i++) printf("%d ", *(a + i));
    putchar('\n');

    select_sort(a, 10);

    printf("After:  ");
    for (int i = 0; i < 10; i++) printf("%d ", *(a + i));
    putchar('\n');
    return 0;
}

指針技巧解析

  • arr + i 等價於 &arr[i],直接計算地址,無下標轉換開銷
  • *min_ptr 直接訪問值,交換時只需三次解引用
  • 參數 int *arr 退化為指針,函數內無法獲取數組長度,必須額外傳 n

二、二分查找:指針版

// 返回找到的元素指針,未找到返回 NULL
int *binary_search(int *arr, int n, int target) {
    int *low = arr;
    int *high = arr + n - 1;

    while (low <= high) {
        int *mid = low + (high - low) / 2;  // 指針算術:只能相減、加整數
        if (*mid == target) return mid;
        if (*mid < target) low = mid + 1;
        else high = mid - 1;
    }
    return NULL;
}

int main() {
    int a[10] = {2, 4, 5, 13, 15, 20, 30, 35, 40, 50};
    int *p = binary_search(a, 10, 20);
    if (p) printf("Found %d at index %ld\n", *p, p - a);
    else puts("Not found");

    p = binary_search(a, 10, 33);
    if (p) printf("Found %d\n", *p);
    else puts("Not found");
    return 0;
}

指針算術關鍵規則

操作合法性結果類型示例
指針 + 整數✓指針p + 3
指針 - 整數✓指針p - 2
指針 - 指針✓ (同一數組)ptrdiff_t (有符號整數)p2 - p1 = 元素個數
指針 + 指針✗—無意義
指針比較✓ (同一數組)intp1 < p2

三、進階:指針作為輸出參數

// 交換兩變量值
void swap(int *a, int *b) {
    int tmp = *a; *a = *b; *b = tmp;
}

// 返回多個值:最小值、最大值指針
void min_max(int *arr, int n, int **out_min, int **out_max) {
    int *min = arr, *max = arr;
    for (int i = 1; i < n; i++) {
        if (arr[i] < *min) min = &arr[i];
        if (arr[i] > *max) max = &arr[i];
    }
    *out_min = min;
    *out_max = max;
}

四、總結

指針在算法中的核心價值:

  1. 直接內存操作:無下標檢查開銷,排序、查找、鏈表、樹操作極致高效
  2. 統一介面:同一函數處理數組、動態分配內存、子數組切片
  3. 輸出參數:通過多級指針返回多個值或修改調用者變量
  4. 指針算術:p + i、p2 - p1 直觀表達「偏移」與「距離」

掌握指針解引用、算術、參數傳遞三板斧,是寫出高性能、可復用 C 算法代碼的關鍵。

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