指標是儲存記憶體位址的變數。透過位址間接存取目標物件。
int *pNumber; // 宣告指向 int 的指標
pNumber = &someVar; // 取址運算子 &,獲取 someVar 位址
*pNumber = 25; // 解引用運算子 *,經由位址存取/修改值
命名慣例:前綴 p (如 pHead, pNode) 明確標識指標類型。
#include <stdio.h>
void main() {
int nNumber = 15;
int *pPointer = &nNumber;
printf("nNumber = %d\n", nNumber); // 15
*pPointer = 25; // 透過指標修改
printf("nNumber = %d\n", nNumber); // 25 ← 原變數被改變
}
int *pGlobal;
void BadFunc() {
int nLocal = 25;
pGlobal = &nLocal; // pGlobal 指向棧上區域變數
} // 函式結束,nLocal 銷毀,棧幀回收
void main() {
BadFunc();
printf("%d\n", *pGlobal); // 未定義行為!可能印出垃圾值、崩潰、或偶爾正確
}
鐵律:絕不回傳/儲存區域變數 (棧上) 的位址供外部使用。
#include <stdlib.h> // malloc, free
int *p = (int*)malloc(sizeof(int)); // 向堆積申請 4 位元組
if (p == NULL) { /* 分配失敗處理 */ }
*p = 100; // 使用
printf("%d\n", *p);
free(p); // 歸還堆積
p = NULL; // 防野指標
malloc 失敗回傳 NULL,未檢查直接解引用 → 崩潰。malloc 對應一個 free,否則洩漏。int arr[5] = {10,20,30,40,50};
int *p = arr; // 陣列名退化為首元素位址
p[2] == *(p+2) == arr[2] == 30; // 指標運算以元素大小為單位
p++; // 指向下一個 int (位址 + sizeof(int))
int *p = NULL; 或 int *p = &var;。NULL/無效位址 → 使用前檢查。malloc/free 配對。free 後置 NULL,僅釋放 malloc 回傳位址。strncpy/snprintf 等安全函式。指標是 C 語言靈魂:位址、解引用、作用域、堆積/棧 四大支柱。掌握「& 取址 → * 解引用 → malloc/free 控制生命週期 → free 後 =NULL」完整鏈路,並敬畏「區域變數位址不出作用域」鐵律,即可駕馭指標威力,避開核心坑點。