記憶體與指標

指向指標的指標

如果一個指標持有某個值的位址,那麼「指向指標的指標」持有的就是一個指標的位址。那張紙條現在指向另一張紙條,而後者再指向房子。聽起來像是多了一層多餘的間接,但只要函式需要改變「呼叫者的指標指向什麼」,它就會登場。

用多一個星號寫出,宣告為「指向 int 指標的指標」的變數,持有的是某個 int * 變數的位址。跟著它走分兩步:第一次解參考給你內層指標,第二次解參考給你那個 int。最常見的需求是讓函式更新呼叫者的指標——例如一個配置記憶體並把新指標寫回「呼叫者所擁有的指標」的程序,於是它接收那個指標的位址。(真正的雙星號宣告屬於程式碼,放在範例中。)另一個日常案例是命令列引數:主函式接收一個「字串指標陣列」的位址。

誠實的提醒是:每多一層,就只是多一個必須維持正確的位址。指向指標的指標並不神奇;它就是「& 取位址、* 跟著走」的同一個概念套用兩次,同樣的危險也加倍。大多數程式碼從不需要超過兩層,再深下去通常表示用一個小結構會讀起來更好。

void make(char out) { *out = some_buffer; } char *s; make(&s); ——make 接收 s 的位址(型別是 char ),而 *out = ... 把一個新值寫進 s 本身。呼叫後,s 指向 some_buffer。

傳 &s(一個指向指標的指標),函式才能改變 s 本身。

兩層間接表示有兩個位址,在你跟著走之前各自都必須有效——解參考一個星號得到內層指標,而它本身也可能是空的或懸置的。主函式中列出程式引數的那個參數,就是教科書上「指向 char 指標的指標」;範例欄位顯示它真正的雙星號宣告寫法。

又称
double pointer二級指標