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

void 指針深度解析:類型擦除、隱式轉換、解引用限制與指針運算

     編輯:關於C語言

指針的兩個屬性

  1. 指向對象的地址
  2. 指向對象的類型 (決定解引用訪問字節數、指針運算步長)
  3. void* 的特殊性

    • 無類型信息,只保存地址
    • 任何類型指針可**隱式轉換**賦值給 void*:void *vp = int_ptr;
    • void* 賦值給具體指針需**顯式強轉**:int *ip = (int*)vp;
    • 不能直接解引用:*vp 編譯錯誤 (不知道讀幾字節)
    • 不能直接參與指針運算:vp++ 錯誤 (不知道步長),需 (char*)vp++ 或 (int*)vp++

    實戰示例:通用鏈表節點

    typedef struct Node {
        void *data;
        struct Node *next;
    } Node;
    
    // 使用
    int val = 42;
    Node *n = malloc(sizeof(Node));
    n->data = &val; // 隱式轉換 int* → void*
    
    // 取用時強轉回原類型
    int *p = (int*)n->data;
    printf("%d\n", *p); // 42

    進階:模擬多態 (C 語言面向對象雛形)

    typedef struct { int id; int fa[2]; } ST;
    
    ST *p = malloc(sizeof(ST)); p->id = 1; p->fa[0]=2; p->fa[1]=3;
    ST *q = malloc(sizeof(ST)); q->id = 2; q->fa[0]=4; q->fa[1]=5;
    
    void **link = malloc(sizeof(void*));
    *link = q; // void* 存儲 q
    
    // 取用
    ST *retrieved = (ST*)*link;
    printf("%d %d %d\n", retrieved->id, retrieved->fa[0], retrieved->fa[1]);

    總結

    void* 是 C 語言實現泛型編程、回調函數上下文傳遞、異構容器的基石。核心規則:只傳地址,不傳類型;用時強轉,運算轉 char*。

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