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

徹底搞定 C 語言指針(一):變量存儲本質、內存地址與取址操作核心概念

     編輯:關於C語言

徹底搞定 C 語言指針(一):變量存儲本質、內存地址與取址操作核心概念

指針是 C 語言的靈魂,理解指針的前提是理解 **變量在內存中如何存儲**。本文用「電影院座位」類比,從內存編址、變量聲明映射、賦值本質、取址操作四個維度,建立指針學習的堅實心智模型。

1. 內存空間:巨大的「座位表」

  • 內存 = 連續的字節序列
  • 每字節有唯一編號 = **內存地址** (0, 1, 2, ...)
  • 地址 = 座位號,數據 = 坐在座位上的人
內存地址 →  6   7   8   9   10  11  12  13
           ┌───┬───┬───┬───┬───┬───┬───┬───┐
數據區    │   │   │   │   │   │   │   │   │ ...
           └───┴───┴───┴───┴───┴───┴───┴───┘

2. 變量聲明 = 向內存「申請座位」


int i;    // 申請 2 字節 (假設 16 位 int),命名為 i
char a;   // 申請 1 字節,命名為 a

內存映射示例 (假設 i 從地址 6 開始,a 從 8 開始):

內存地址 →  6   7   8   9   10  11  12  13
           ┌───┬───┬───┬───┬───┬───┬───┬───┐
數據區    │ i (2 bytes) │ a (1 byte)  │   │ ...
           └───┴───┴───┴───┴───┴───┴───┴───┘
變量名     ← i →      ← a →
  • int 寬度因平台而異 (16/32/64 位系統分別為 2/4/8 字節)
  • 變量名 = 起始地址的**別名** (符號表條目)

3. 賦值 = 將數據「寫入座位」


i = 30;      // 將 30 的二進制表示寫入 i 佔用的 2 字節
a = 't';     // 將 't' 的 ASCII 碼 (116) 寫入 a 佔用的 1 字節
內存地址 →  6   7   8   9   ...
           ┌───────┬───┐
數據區    │  30   │'t'│ ...
           └───────┴───┘

4. 取址操作 & = 詢問「座位號」


&i  // 返回變量 i 的起始內存地址 (上例中為 6)
  • & 是**一元運算符**,只能作用於**左值** (有地址的對象)
  • printf("%p", &i); 打印地址 (用 %p 格式,非 %d)

完整驗證代碼


#include 

int main() {
    int i = 39;
    printf("i 的值: %d\n", i);        // ① 輸出 39
    printf("i 的地址: %p\n", (void*)&i); // ② 輸出類似 0x7ffd12345678
    return 0;
}

關鍵區別:

  • i 代表 **存儲在內存中的數值**
  • &i 代表 **該數值存放的內存位置編號**

心智模型檢驗題

  1. char c = 'A'; 佔用幾字節?地址範圍?
  2. int arr[3] = {1,2,3}; 數組名 arr 代表什麼地址?
  3. 為什麼 &i 不能出現在賦值號左邊?

下篇預告

正式進入指針世界:**指針變量聲明、初始化、解引用 *、指針算術、指針與數組的深度綁定關係** — 從「知道座位號」到「憑座位號找人、移動座位、操作數據」。

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