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

C語言指標陣列完全指南:定義、應用場景、字串排序與動態記憶體配置

     編輯:關於C語言

指標陣列定義與本質

語法:型態 *陣列名[長度];
解析順序:[ ] 優先級高於 * → 先形成陣列,再每元素為指標。
本質:陣列元素皆為指標,各自指向對應型態資料。

宣告範例


char *str[4];   // 4 個 char* 指標:str[0]~str[3]
int *ptr[5];    // 5 個 int* 指標:ptr[0]~ptr[4]

三大經典應用場景

1. 指向字串陣列(字串指標陣列)


char *ptr1[4] = {"china", "chengdu", "sichuan", "chongqing"};
// ptr1[0]→"china", ptr1[1]→"chengdu"...
for (i = 0; i < 4; i++) printf("\n%s", ptr1[i]);

字串常數區唯讀,指標指向常數區,不可修改內容。

2. 指向一維陣列元素


int a[3] = {1, 2, 3};
int *ptr2[3];
for (i = 0; i < 3; i++) ptr2[i] = &a[i];  // 取元素位址
for (i = 0; i < 3; i++) printf("%4d", *ptr2[i]);  // 輸出 1 2 3

3. 指向二維陣列各列首元素


int b[3][2] = {{1,2}, {3,4}, {5,6}};
for (i = 0; i < 3; i++) ptr2[i] = b[i];  // b[i] 為第 i 列首位址
for (i = 0; i < 3; i++)
    printf("%4d%4d\n", *ptr2[i], *(ptr2[i]+1));  // 列印第 i 列兩元素

關係:ptr2[i] 指向 b[i][0],ptr2[i]+1 指向 b[i][1]。

指標陣列處理二維字元陣列(字串陣列)

二維字元陣列 char str[5][20] 可視為 5 個字串。指標陣列提供靈活操作:排序時交換指標而非複製字串內容,效率高。

範例 1:冒泡排序字串(指標陣列 + 靜態緩衝區)


#include 
#include 
#include 

main() {
    char *ptr1[4], str[4][20], temp[20];
    int i, j;

    for (i = 0; i < 4; i++) gets(str[i]);      // 輸入 4 字串
    for (i = 0; i < 4; i++) ptr1[i] = str[i];  // 指標指向各列首址

    printf("original string:\n");
    for (i = 0; i < 4; i++) printf("%s\n", ptr1[i]);

    // 冒泡排序:交換指標
    for (i = 0; i < 3; i++)
        for (j = 0; j < 3 - i; j++)
            if (strcmp(ptr1[j], ptr1[j+1]) > 0) {
                strcpy(temp, ptr1[j]);
                strcpy(ptr1[j], ptr1[j+1]);
                strcpy(ptr1[j+1], temp);
            }

    printf("sorted string:\n");
    for (i = 0; i < 4; i++) printf("%s\n", ptr1[i]);
}

注意:此版本實際複製字串內容(strcpy),指標陣列優勢未完全發揮。真正優勢見範例 2。

指標安全性關鍵

指標陣列定義後,元素指向不確定(野指標)。
char *ptr[3]; → 三個指標指向隨機位址。
scanf("%s", ptr[i]) 將寫入隨機記憶體 → 崩潰/安全漏洞。
必須先指派安全位址:指向現有陣列、malloc 分配區、字串常數區。

範例 2:malloc 動態分配 + 指標交換排序(高效)


#include 
#include 
#include 

main() {
    char *ptr1[4], *temp;
    int i, j;

    for (i = 0; i < 4; i++) {
        ptr1[i] = malloc(20);  // 為每指標分配 20 bytes
        gets(ptr1[i]);         // 直接讀入分配區
    }

    printf("original string:\n");
    for (i = 0; i < 4; i++) printf("%s\n", ptr1[i]);

    // 冒泡排序:僅交換指標值(極快)
    for (i = 0; i < 3; i++)
        for (j = 0; j < 3 - i; j++)
            if (strcmp(ptr1[j], ptr1[j+1]) > 0) {
                temp = ptr1[j];       // 指標交換
                ptr1[j] = ptr1[j+1];
                ptr1[j+1] = temp;
            }

    printf("sorted string:\n");
    for (i = 0; i < 4; i++) printf("%s\n", ptr1[i]);

    // 釋放記憶體(良好習慣)
    for (i = 0; i < 4; i++) free(ptr1[i]);
}

優勢對比:

方式排序時操作時間複雜度記憶體管理
靜態陣列 + strcpy複製字串內容O(n² × 字串長度)自動(棧上)
malloc + 指標交換交換指標值 (4/8 bytes)O(n²)手動 malloc/free

指標陣列記憶體圖解


// 靜態版:ptr1 指向 str 陣列各列
ptr1[0] → str[0] → [c][h][i][n][a][\0]
ptr1[1] → str[1] → [c][h][e][n][g][d][u][\0]
...

// 動態版:ptr1 指向 heap 區塊
ptr1[0] → malloc(20) → [c][h][i][n][a][\0][?][?]...
ptr1[1] → malloc(20) → [c][h][e][n][g][d][u][\0]...
...

進階應用:命令列參數 argv 即指標陣列


main(int argc, char *argv[])  // argv 為 char* 陣列

系統啟動時建立,指向命令列各參數字串。

總結

  1. 指標陣列:型態 *名[長度],每元素為指標
  2. 三大用途:字串指標陣列、指向純量變數、指向二維陣列列首
  3. 字串排序最佳實踐:malloc 分配 + 指標交換(不動字串內容)
  4. 指標安全第一:使用前必須指派合法位址(現有陣列、malloc、常數區)
  5. 動態分配後記得 free 釋放
  6. argv、環境變數 envp 皆為系統建構的指標陣列
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved