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

C/C++ 指標進階:字元指標陣列與指向指標的指標完圖解

     編輯:關於C++

核心概念速覽

  • 字元指標陣列:char *a[] —— 陣列每個元素是 char*,儲存字串首地址。
  • 指向指標的指標:char **b —— 儲存「指標陣列首地址」的變數,雙重間接訪問字串。
  • 關鍵差異:a 是陣列名(常量地址),b 是指標變數(可修改指向)。

實例 1:字元指標陣列與雙重指標互動

char *a[] = { "abc", "cde", "fgh" };  // 靜態區存字串,棧上存三個指標
char **b = a;                           // b 指向陣列首元素(即 "abc" 的地址)

cout << *b << "|" << *(b+1) << "|" << *(b+2) << endl;
// 輸出:abc|cde|fgh

記憶體佈局圖解

棧區 (a[]):     [0x1000] → 0x5000 ("abc")
                [0x1004] → 0x5004 ("cde")
                [0x1008] → 0x5008 ("fgh")

靜態區:         0x5000: 'a''b''c''\0'
                0x5004: 'c''d''e''\0'
                0x5008: 'f''g''h''\0'

b = 0x1000 (a 的首地址)
*b  = 0x5000 → "abc"
*(b+1) = 0x5004 → "cde"   // 32位系統指標 4 bytes,+1 即 +4 bytes
*(b+2) = 0x5008 → "fgh"

記憶體結構示意圖

為什麼輸出整個字串而非單一字元?

cout << char* 會從該地址持續輸出直到遇到 \0,這是 C++ 流對 C 風格字串的約定行為。

實例 2:函數參數傳遞字元指標陣列

void print_char(char *array[], int len) {
    for (int i = 0; i < len; ++i)
        cout << *array++ << endl;  // array 是指標變數,可遞增
}

void main() {
    char *test[] = { "abc", "cde", "fgh" };
    int num = sizeof(test) / sizeof(char*);  // 3
    print_char(test, num);
}

傳遞機制解析

  • 實參 test 退化為 char**(首元素地址)傳入。
  • 形參 char *array[] 與 char **array 等價,均為指標變數,存儲於棧區,可作為左值修改(如 array++)。
  • 每次 array++ 移動 sizeof(char*) bytes,逐一取得字串首址並解引用輸出。

常見誤區與避坑指南

錯誤寫法正確寫法原因
char *b = a;char **b = a;類型不匹配:a 是 char*[3],退化為 char**
char a[] = {"abc","cde"}char *a[] = {"abc","cde"}char a[] 是單一字元陣列,無法存多個字串首址
以為 *(b+1) 輸出 'c'理解為輸出 "cde"b+1 移動一個指標槽位,非字元位移

進階延伸:命令列參數 argv

int main(int argc, char *argv[]) 中的 argv 正是字元指標陣列,argv[0] 為程式路徑,argv[1] 起為使用者參數。掌握本文概念,處理命令列解析將得心應手。

總結

  1. char *a[] 定義指標陣列,元素型別 char*,存字串首址。
  2. char **b = a 讓雙重指標指向陣列首元素,支援 *(b+i) 遍歷。
  3. 32 位系統指標 4 bytes,指標運算 +1 即位移 4 bytes。
  4. 函數傳遞陣列實為傳遞首元素地址,形參可寫作 char ** 或 char *[]。
  5. 多畫圖、多觀察記憶體地址、多實驗輸出,指標概念自會內化。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved