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

C語言指針完全指南:從入門到進階實戰

     編輯:關於C語言

C語言指針完全指南:從入門到進階實戰

指針是 C 語言的核心靈魂,也是初學者最大的攔路虎。本文系統梳理指針概念、聲明、使用、動態記憶體管理、多級指針等核心知識,並附帶完整可執行範例代碼。

一、什麼是指針?

指針本質上是一個儲存記憶體地址的變數。 它「指向」另一個變數所在的記憶體位置,透過地址間接存取資料。

  • 記憶體中每個位元組都有唯一編址(地址)
  • 指針變數儲存這個地址值
  • 透過指針可間接讀寫目標記憶體

指針概念圖

二、指針聲明與初始化

// 語法:資料型別 *指針名 = &目標變數;
int a = 10;
int *p = &a;  // p 指向 a 的地址

關鍵規則:

  • 聲明即初始化:未初始化的指針是「野指針」,指向隨機地址,解引用會導致未定義行為
  • 只能指向地址:初始化時右值必須是地址(&a、malloc 返回值、另一指針),不能是資料值

三、指針基本操作

運算子含義範例
*解引用(取值)*p 獲取 p 指向的值
&取址&a 獲取 a 的地址
* (聲明時)標識指針型別int *p
* (運算時)單目運算子/乘法*p / 5 * 5

四、完整範例:指針基礎操作

#include <stdio.h>

int main(void) {
    int a = 10;
    int *p = &a;  // 聲明並初始化
    
    printf("a 的值為 %d\n", a);       // 10
    printf("a 的值為 %d\n", *p);      // 10(透過指針取值)
    printf("a 的地址為 %p\n", (void*)p);   // 地址值
    printf("a 的地址為 %p\n", (void*)&a);  // 相同地址
    
    *p = 20;  // 透過指針修改 a
    printf("修改後 a = %d\n", a);     // 20
    
    return 0;
}

五、空指針與動態記憶體管理

空指針 (NULL):明確表示「不指向任何有效記憶體」,防止野指針。

int *p = NULL;  // 安全的初始狀態

動態記憶體分配:

#include <stdlib.h>  // malloc, free

int *p = (int*)malloc(sizeof(int));  // 分配 4 位元組
if (p == NULL) {
    fprintf(stderr, "記憶體分配失敗\n");
    exit(EXIT_FAILURE);
}

*p = 100;
printf("值:%d\n", *p);

free(p);  // 必須釋放,避免記憶體洩漏
p = NULL; // 防止懸空指針

鐵律:malloc 與 free 必須成對出現。

六、雙重指針(指針的指針)

int a = 1;
int *p1 = &a;      // 一級指針
int **p2 = &p1;    // 二級指針,指向 p1

printf("%d\n", **p2);  // 1:p2 → p1 → a

應用場景:函數修改指針本身、二維動態陣列、命令列參數 char **argv。

七、常見陷阱與避坑指南

陷阱後果防範
野指針程式崩潰/資料損壞聲明即初始化,free 後置 NULL
記憶體洩漏記憶體耗盡malloc/free 成對,工具檢測
懸空指針存取已釋放記憶體free 後立即置 NULL
緩衝區溢出覆蓋相鄰記憶體嚴格檢查邊界,使用安全函數
型別不匹配解讀錯誤指針型別與目標型別一致

八、編譯器位數與型別大小關係

歷史原因導致不同編譯器 int 大小不同:

  • 16 位編譯器 (TC 2.0):int = 2 位元組
  • 32 位編譯器 (VC 6.0, GCC 32bit):int = 4 位元組
  • 64 位編譯器:int 通常仍為 4 位元組,long/指針為 8 位元組

最佳實踐:使用 sizeof(int)、int32_t (需 <stdint.h>) 等可移植寫法,避免硬編碼大小。

記憶體越界示意

總結

指針賦予 C 語言直接操作記憶體的威力,也帶來了相應的責任。掌握指針的關鍵在於:理解記憶體模型、嚴格遵循初始化/釋放規範、善用工具檢測(Valgrind、AddressSanitizer)。從基礎操作到動態管理、多級指針,層層遞進,方能駕馭 C 語言的核心力量。

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