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

C 語言指針基礎入門:聲明、空指針、野指針與類型兼容性

     編輯:關於C語言

1. 指針聲明與賦值

int i = 10;
int *p;       // 聲明指向 int 的指針
p = &i;       // 取址賦值
*p = 100;     // 解引用修改 i
// 或聲明時初始化
int *p2 = &i;

2. 空指針

int *p = NULL; // 或 (void*)0
// 解引用空指針導致未定義行為(通常崩潰)

用於初始化、判斷指針是否有效、函數返回失敗標誌。

3. 野指針/懸空指針

int *p;        // 未初始化,值不可知
*p = 100;      // 極度危險:寫入隨機地址
// 或
int *p = malloc(...);
free(p);
*p = 100;      // 釋放後未置 NULL,同樣危險

本質:指針指向未知/已釋放內存。現代 OS 通過內存保護(頁表權限)捕獲非法訪問,導致進程收到 SIGSEGV 終止,保護系統穩定。

4. 指針類型兼容性

  • 指針大小與架構相關:32 位 4 字節,64 位 8 字節(sizeof(void*))。
  • 不同類型指針不可直接賦值(C++ 更嚴格,C 給警告但允許)。
  • void* 為通用指針,可接收任意類型指針賦值,但解引用前必須強轉回原類型。
int *pi; char *pc; void *pv;
pv = pi;  // OK
pv = pc;  // OK
pi = pv;  // C: 警告; C++: 錯誤(需顯式轉型)
pi = pc;  // 錯誤:類型不匹配

5. 代碼演示(關鍵片段)

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 或合法地址)。
  • 釋放內存後**立即置 NULL**,杜絕懸空指針。
  • 嚴格遵守類型匹配,必要時用 void* 做中轉並加註釋。
  • 理解指針大小由地址總線寬度決定,與指向類型無關。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved