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

C語言指針深度解析:從一級到二級指針的內存模型

     編輯:關於C語言

指針與多級指針的內存佈局圖解

通過一個完整示例,直觀展示變量、一級指針、二級指針的地址與值關係,消除指針理解難點。

示例代碼與輸出

int main(void) {
    int a = 5;
    int *p = &a;
    int **p1 = &p;

    printf("a 地址: %p\n", &a);
    printf("p 值: %p, p 地址: %p\n", p, &p);
    printf("p1 值: %p, p1 地址: %p\n", p1, &p1);

    printf("a 值: %d\n", a);
    printf("經 p 訪問: %d\n", *p);
    printf("經 p1 訪問: %d\n", **p1);
    return 0;
}

實際輸出(地址示例)

a 地址: 0x7fffd57a181c
p 值: 0x7fffd57a181c, p 地址: 0x7fffd57a1808
p1 值: 0x7fffd57a1808, p1 地址: 0x7fffd57a1810

a 值: 5
經 p 訪問: 5
經 p1 訪問: 5

逐層解析

  1. 基礎變量:a 存儲值 5,地址 &a = 0x7fffd57a181c
  2. 一級指針 p:
    • p = &a → 存儲 a 的地址
    • *p → 解引用得 a 的值 5
    • &p → p 自身的地址 0x7fffd57a1808
  3. 二級指針 p1:
    • p1 = &p → 存儲 p 的地址
    • *p1 → 解引用得 p 的值(即 a 的地址)
    • **p1 → 雙重解引用得 a 的值 5
    • &p1 → p1 自身的地址 0x7fffd57a1810

核心概念總結

  • 指針本質:存儲地址的變量,自身也有地址
  • 解引用 *:沿著地址找到目標值
  • 多級指針:逐層解引用,每級減少一次間接訪問
  • 地址鏈:p1 → &p → p → &a → a

常見誤區

  • 混淆 p(地址值)與 *p(目標值)
  • 以為 **p1 是直接操作 p1 的值,實際是 *(*p1)
  • 忽略指針自身佔用內存空間(32 位 4 字節,64 位 8 字節)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved