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

C 語言指針進階:指向指針的指針(雙重指針)詳解與實戰

     編輯:關於C語言

基礎回顧:單級指針

short int i = 50;
short int *p = &i;

內存佈局:

  • i 地址 5~6(2 字節),值 50
  • p 地址 11~14(4 字節),值 5(即 &i)

變量內存佈局

賦值後內存

雙重指針

short int **pp = &p;  // pp 存儲 p 的地址(11)

內存示意:

雙重指針內存

  • pp 指向 p
  • *pp 等價於 p(值為 5)
  • **pp 等價於 *p 即 i(值為 50)

實戰場景:函數修改指針本身

需求:在函數內為指針分配內存或修改其指向,需傳遞指針的地址。

錯誤示範(值傳遞)

void find1(char array[], char search, char *p) {
    // 修改 p 只影響副本,外部實參不變
    p = array + i;  // 外部 pa 仍為 NULL
}

正確示範(雙重指針)

void find2(char array[], char search, char **pp) {
    // 通過 *pp 修改外部指針指向
    *pp = array + i;  // 外部 pa 被正確修改
}

完整可運行代碼

#include <stdio.h>

void find1(char array[], char search, char *p);
void find2(char array[], char search, char **pp);

int main(void) {
    char str[] = "afsdfsdfd";
    char a = 'd';
    char *pa = NULL;
    
    // find1(str, a, pa);  // 失敗
    find2(str, a, &pa);   // 成功
    
    if (pa == NULL) {
        printf("沒找到!\n");
    } else {
        printf("找到了,pa = %#x\n", (unsigned int)pa);
    }
    return 0;
}

void find1(char array[], char search, char *p) {
    for (int i = 0; array[i] != '\0'; i++) {
        if (array[i] == search) {
            p = &array[i];
            break;
        }
    }
}

void find2(char array[], char search, char **pp) {
    for (int i = 0; array[i] != '\0'; i++) {
        if (array[i] == search) {
            *pp = &array[i];
            break;
        }
    }
}

輸出結果

找到了,pa = 0x12ff77

核心總結

場景參數類型函數內操作外部影響
修改指針指向的值T *p*p = val生效
修改指針本身(指向)T **pp*pp = new_addr生效
修改指針本身T *pp = new_addr不生效(副本)

延伸應用

  • 動態分配二維陣列:int **matrix = malloc(rows * sizeof(int*))
  • 鏈表節點刪除:需修改前驅節點的 next 指針,傳 Node **prev_next
  • 命令行參數:char **argv 指向字符串指針陣列
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved