int i = 10;
int *p; // 聲明指向 int 的指針
p = &i; // 取址賦值
*p = 100; // 解引用修改 i
// 或聲明時初始化
int *p2 = &i;
int *p = NULL; // 或 (void*)0
// 解引用空指針導致未定義行為(通常崩潰)
用於初始化、判斷指針是否有效、函數返回失敗標誌。
int *p; // 未初始化,值不可知
*p = 100; // 極度危險:寫入隨機地址
// 或
int *p = malloc(...);
free(p);
*p = 100; // 釋放後未置 NULL,同樣危險
本質:指針指向未知/已釋放內存。現代 OS 通過內存保護(頁表權限)捕獲非法訪問,導致進程收到 SIGSEGV 終止,保護系統穩定。
sizeof(void*))。void* 為通用指針,可接收任意類型指針賦值,但解引用前必須強轉回原類型。int *pi; char *pc; void *pv;
pv = pi; // OK
pv = pc; // OK
pi = pv; // C: 警告; C++: 錯誤(需顯式轉型)
pi = pc; // 錯誤:類型不匹配
void function5(void) {
char *pc; int *pi; double *pd;
printf("指針大小: pc=%zu, pi=%zu, pd=%zu\n", sizeof(pc), sizeof(pi), sizeof(pd)); // 均為 8 (64位)
int i; int *p1 = &i;
unsigned int u; // p1 = &u; // C++ 錯誤,C 警告
void *pv = &u; // OK
// p1 = pv; // C++ 錯誤
}
NULL 或合法地址)。void* 做中轉並加註釋。