首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言指針數組實現字符串指針自增遍歷:定義 char **p 移動到下一字符串

     編輯:程式設計疑難解答

問題場景

需定義一個指針變量,使其自增操作 (p++) 能夠跳轉到下一個字符串地址。這要求指針指向的對象是「字符串指針」即 char *,因此指針本身類型為 char ** (指向指針的指針)。

核心代碼實現

#include <stdio.h>

int main() {
    // 1. 定義字符串指針數組 (每個元素是 char*,指向字符串常量)
    char *arr[3] = {"abcde", "1234", "42"};

    // 2. 定義指向指針的指針,指向數組首元素地址
    char **p = &arr[0];  // 等價於 char **p = arr; (數組名退化為首元素地址)

    // 3. 遍歷:p++ 會按 sizeof(char*) 步長移動,指向下一個字符串指針
    for (int i = 0; i < 3; i++, p++) {
        printf("第 %d 個字符串: %s\n", i + 1, *p); // *p 解引用得到 char*,即字符串首地址
    }

    // 輸出:
    // 第 1 個字符串: abcde
    // 第 2 個字符串: 1234
    // 第 3 個字符串: 42

    return 0;
}

內存模型圖解

arr (字符串指針數組)           p (char **) 遍歷過程
+--------+--------+--------+      初始: p -> arr[0]
| arr[0] | arr[1] | arr[2] |      p++   : p -> arr[1]
+--------+--------+--------+      p++   : p -> arr[2]
   |        |        |
   v        v        v
 "abcde"  "1234"   "42"

關鍵點總結

  • 類型匹配:`char **p` 指向 `char *` 類型對象,`p++` 步長為指針大小 (32位 4字節 / 64位 8字節)。
  • 數組退化:`arr` 作為函數參數或賦值時退化為 `char **` (首元素地址)。
  • 解引用層級:`p` 是地址,`*p` 是字符串首地址 (`char *`),`**p` 是首字符 (`char`)。
  • 常量正確性:字符串字面量存儲在只讀區,應定義為 `const char *arr[]`,`p` 為 `const char **`。

進階:動態分配字符串指針數組

int n = 3;
char **dynamicArr = malloc(n * sizeof(char *));
dynamicArr[0] = strdup("Hello");
dynamicArr[1] = strdup("World");
dynamicArr[2] = strdup("!");

char **p = dynamicArr;
for (int i = 0; i < n; i++, p++) {
    puts(*p);
}

// 釋放內存
for (int i = 0; i < n; i++) free(dynamicArr[i]);
free(dynamicArr);

總結

定義 char **p 指向字符串指針數組首元素,即可通過 p++ 實現逐字符串遍歷。這是 C 語言處理字符串列表、命令行參數 (argv) 的核心技巧。

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