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

C 語言指標入門到進階:定義、解引用、作用域陷阱與動態記憶體分配核心實戰

     編輯:關於C語言

一、 指標本質

指標是儲存記憶體位址的變數。透過位址間接存取目標物件。

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;  // 防野指標
  • 堆積記憶體:生命週期由程式設計師完全控制,跨函式共享,大小僅受虛擬記憶體限制。
  • 檢查 NULL:malloc 失敗回傳 NULL,未檢查直接解引用 → 崩潰。
  • 配對釋放:每個 malloc 對應一個 free,否則洩漏。
  • 釋放置 NULL:防止後續誤用已釋放記憶體 (Use-After-Free)。

五、 進階:指標運算與陣列

int arr[5] = {10,20,30,40,50};
int *p = arr;      // 陣列名退化為首元素位址
p[2] == *(p+2) == arr[2] == 30; // 指標運算以元素大小為單位
p++;               // 指向下一個 int (位址 + sizeof(int))

六、 常見錯誤清單

  1. 未初始化指標 (野指標) → int *p = NULL; 或 int *p = &var;。
  2. 解引用 NULL/無效位址 → 使用前檢查。
  3. 記憶體洩漏 → 嚴格 malloc/free 配對。
  4. 重複釋放 / 釋放非堆積位址 → free 後置 NULL,僅釋放 malloc 回傳位址。
  5. 緩衝區溢位 → 寫入前確認容量,用 strncpy/snprintf 等安全函式。

總結

指標是 C 語言靈魂:位址、解引用、作用域、堆積/棧 四大支柱。掌握「& 取址 → * 解引用 → malloc/free 控制生命週期 → free 後 =NULL」完整鏈路,並敬畏「區域變數位址不出作用域」鐵律,即可駕馭指標威力,避開核心坑點。

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