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

C 指標本質深度剖析:位址、指標、陣列名與字串常量

     編輯:關於C語言

核心觀念釐清

1. 位址是基本資料型別

位址與整數、浮點數、字元同層,屬於基本型別。指標不是型別,只是儲存位址型別資料的變數。類比:int i=10 中 10 是整數,i 是儲存整數的變數;指標對應 i,位址對應 10。指標能加減是因為位址型別本身支援加減運算,並非指標特有。

2. 指標本質是變數

int *p 宣告指標 p,編譯器配置 2/4 位元組(16/32 位系統)儲存空間。使用 p 時取的是該空間的內容(一個位址)。&p 取的是指標變數自身的位址。*p 取 p 內容(位址)所指向儲存空間的內容。

3. 陣列名是位址常數(右值)

陣列名不是指標。它是符號常數,代表陣列在堆疊上靜態配置記憶體的首位址。int a[10] 中,a 等同於 &a,皆為位址常數,不可修改(右值)。指標是變數(左值)。右值永不會是左值,故陣列名永不會是指標。

字元陣列 vs 字串指標:記憶體佈局差異

char a[] = "Hello World";  // 空間在堆疊,可修改
char *p = "Hello World";   // 空間在靜態儲存區(唯讀),不可修改

*(a+1) = 'u' 成功;*(p+1) = 'u' 觸發段錯誤(存取違規)。

三大儲存區

  1. 靜態儲存區:編譯期配置,全程駐留。存放靜態/全域資料、常量(含字串字面值)。
  2. 堆疊區:函數執行時建立區域變數,返回自動釋放。配置效率高但容量有限。
  3. 堆區:malloc/new 動態申請,free/delete 手動釋放。

char a[] 內容複製到堆疊,可寫;char *p 指向唯讀區的字串常量,寫入導致未定義行為。

圖解記憶體模型

記憶體佈局示意圖

圖示呈現:堆疊區的陣列 a 獨擁可寫副本;靜態區的字串常量被多個指標共享,受硬體/OS 保護不可寫。

實務啟示

  • 需要修改字串內容時,必須使用陣列或動態配置記憶體(strdup/malloc + strcpy)。
  • 函數參數若為 char * 接收字串字面值,應宣告為 const char * 防止誤寫。
  • 理解「指標是變數、位址是型別、陣列名是常數」三者關係,能避開 90% 指標相關 Bug。

指標被譽為 C 語言靈魂,透過本質層面的釐清,不再死記語法規則,而是從記憶體模型推導行為,才能真正駕馭它。

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