位址與整數、浮點數、字元同層,屬於基本型別。指標不是型別,只是儲存位址型別資料的變數。類比:int i=10 中 10 是整數,i 是儲存整數的變數;指標對應 i,位址對應 10。指標能加減是因為位址型別本身支援加減運算,並非指標特有。
int *p 宣告指標 p,編譯器配置 2/4 位元組(16/32 位系統)儲存空間。使用 p 時取的是該空間的內容(一個位址)。&p 取的是指標變數自身的位址。*p 取 p 內容(位址)所指向儲存空間的內容。
陣列名不是指標。它是符號常數,代表陣列在堆疊上靜態配置記憶體的首位址。int a[10] 中,a 等同於 &a,皆為位址常數,不可修改(右值)。指標是變數(左值)。右值永不會是左值,故陣列名永不會是指標。
char a[] = "Hello World"; // 空間在堆疊,可修改
char *p = "Hello World"; // 空間在靜態儲存區(唯讀),不可修改
*(a+1) = 'u' 成功;*(p+1) = 'u' 觸發段錯誤(存取違規)。
malloc/new 動態申請,free/delete 手動釋放。char a[] 內容複製到堆疊,可寫;char *p 指向唯讀區的字串常量,寫入導致未定義行為。

圖示呈現:堆疊區的陣列 a 獨擁可寫副本;靜態區的字串常量被多個指標共享,受硬體/OS 保護不可寫。
strdup/malloc + strcpy)。char * 接收字串字面值,應宣告為 const char * 防止誤寫。指標被譽為 C 語言靈魂,透過本質層面的釐清,不再死記語法規則,而是從記憶體模型推導行為,才能真正駕馭它。