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

C 語言雙重指針參數傳遞詳解:為什麼要用指標的指標?

     編輯:關於C

現象:一級指針參數無法修改實參指向

[c]
void fun(char *pa) {
    pa = "bb";  // 只修改了形參 pa 的副本
}

int main() {
    char *p = NULL;
    fun(p);
    // p 仍為 NULL,未被修改
}

原因:參數傳遞本質是**值拷貝**。pa = p 拷貝的是地址值。函數內修改 pa 只影響副本,不影響實參 p。

解決方案:傳遞指針的地址 —— 雙重指針

[c]
void fun(char **pa) {
    *pa = "bb";  // 解引用一次,修改實參指向的內存
}

int main() {
    char *p = NULL;
    fun(&p);     // 傳遞 p 的地址
    // p 現在指向 "bb"
}

內存模型圖解

main 棧幀:          fun 棧幀:
p (0x7ffe...) ───►  pa (0x7ffe...)  ──►  同一地址 0x7ffe...
                    *pa = "bb"  修改 0x7ffe... 處的值

實參 p 的地址 &p 被拷貝給形參 pa。*pa 解引用定位到 p 所在的棧槽,直接修改其存儲的地址值。

常見陷阱:字符串字面量 vs 動態內存

[c]
char *p = "aa";          // 指向只讀區
*pa = "bb";              // 修改指向,合法(指向另一個只讀字面量)

// 但若嘗試修改內容:
// *pa = "bb";  // 只是改指向,OK
// strcpy(*pa, "cc"); // 崩潰!字面量在只讀段,不可寫

正確做法:若需修改字符串內容,實參必須指向可寫內存(棧數組或堆內存):

[c]
char buf[100] = "aa";
char *p = buf;
fun(&p);  // 此時 *pa 可安全 strcpy

進階:三級指針何時用?

  • 二級指針 **:修改一級指針的指向(如分配內存並返回指針)。
  • 三級指針 ***:修改二級指針的指向(如動態分配指針數組)。
  • 以此類推,層級 = 需要修改的指針層數 + 1。

總結

需求參數類型調用方式函數內操作
修改指向的值int *pfun(ptr)*p = val
修改指針指向int **pfun(&ptr)*p = new_addr
修改指針數組int ***pfun(&arr)*p = new_arr

掌握「傳地址以修改原變量」這一核心原理,指針層級不再是迷題。

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