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

C語言指針進階(六):指針數組、指針數組排序、指針數組作函數參數

     編輯:C 語言基礎

指針數組定義與初始化


類型 *數組名[長度];
  • 每個元素是指針,指向同類型數據。
  • 常用於字符串集合、多行文本、異構對象表(配合 void*)。

指向二維數組


int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int *pa[3] = {a[0], a[1], a[2]};  // 每個元素指向一行
int *p = a[0];                    // 單指針指向首行

// 訪問
pa[i][j]  // 等價 *(pa[i]+j) 等價 a[i][j]
p[i]      // 僅能訪問第 0 行

指針數組 vs 二維數組指針

項目指針數組 int *pa[3]二維數組指針 int (*p)[3]
本質多個獨立指針 (3 個 int*)單一指針,指向整個二維數組
聲明括號*pa[3] 無括號(*p)[3] 必須括號
行長度信息無(每行可不同長)有(編譯器知列數)
內存佈局指針數組連續,數據可不連續數據整體連續
動態分配易於逐行 malloc需一次性分配或模擬

字符串指針數組


char *names[] = {
    "Illegal", "Monday", "Tuesday", "Wednesday",
    "Thursday", "Friday", "Saturday", "Sunday"
};
// names[0] -> "Illegal", names[1] -> "Monday" ...
  • 初始化極簡:字面量地址自動填入。
  • 每字符串長度可異,無內存浪費。

指針數組作函數參數:高效字符串排序

交換指針而非字符串內容,O(1) 交換開銷。

完整實現


#include 
#include 

void sort(char *name[], int n) {
    for (int i = 0; i < n-1; ++i) {
        int k = i;
        for (int j = i+1; j < n; ++j)
            if (strcmp(name[k], name[j]) > 0) k = j;
        if (k != i) {
            char *tmp = name[i];
            name[i] = name[k];
            name[k] = tmp;
        }
    }
}

void print(char *name[], int n) {
    for (int i = 0; i < n; ++i) puts(name[i]);
}

int main() {
    char *countries[] = {"CHINA", "AMERICA", "AUSTRALIA", "FRANCE", "GERMAN"};
    int n = 5;
    sort(countries, n);
    print(countries, n);
    return 0;
}

關鍵點

  • strcmp 接受 const char*,指針數組元素類型匹配。
  • 交換 name[i] 與 name[k] 僅搬運指針值(4/8 字節),不動字符數據。
  • 若用二維字符數組 char name[5][20],交換需 strcpy 逐字符拷貝,慢且受限於固定列寬。

指針數組作指針函數參數


char *day_name(char *name[], int n) {
    char *pp1 = name[0];
    char *pp2 = name[n];
    return (n<1 || n>7) ? pp1 : pp2;
}

int main() {
    char *names[] = {"Illegal","Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
    int d; scanf("%d", &d);
    printf("Day %d -> %s\n", d, day_name(names, d));
    return 0;
}
  • 形參 char *name[] 等價 char **name,接收指針數組首地址。
  • 函數內可用 name[i] 或 *(name+i) 訪問。

總結

  • 指針數組 = 指針的有序集合,聲明 類型 *名[長度],無括號。
  • 二維數組指針 類型 (*名)[列數] 有括號,攜帶列數信息,數據連續。
  • 字符串指針數組是管理變長字符串集合的標準模式,初始化簡潔,排序極快(交換指針)。
  • 作函數參數時退化為 類型**,內部按指針數組訪問。
  • 動態分配二維數據時,指針數組逐行 malloc 靈活釋放;二維數組指針需單塊分配或模擬。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved