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

C 語言進階核心:指針、數組、字符串、函數指針與內存管理深度解析

     編輯:關於C語言

第一部分:指針基礎

本質

指針是存儲內存地址的變量,本身佔用固定大小(32 位系統 4 字節,64 位 8 字節)。*p 解引用操作其指向的內存。

常量指針 vs 指針常量

const int *p;     // p 可變,*p 不可變(指向常量的指針)
int *const p;     // p 不可變,*p 可變(常量指針)
const int *const p; // 皆不可變

口訣:const 在 * 左修飾指向值,在右修飾指針本身。

第二部分:數組本質

內存模型

數組是連續內存塊,數組名在多數表達式中退化為指向首元素的常量指針(不可修改)。

關鍵區別

int a[5];
a      // 類型 int*  ,值 &a[0]
&a     // 類型 int(*)[5],值同 a 但步長為整個數組大小
sizeof(a) // 20 (整個數組大小)
sizeof(&a) // 4/8 (指針大小)

第三部分:指針運算與數組訪問

  • p + n 等價於 (char*)p + n * sizeof(*p)。
  • 同一數組內指針相減得元素個數差(ptrdiff_t)。
  • 指針比較僅在指向同一數組元素時有定義行為。

第四部分:字符串處理

定義

C 無字符串類型,以 '\0' 結尾的字符數組模擬字符串。

常用函數族

無長度限制有長度限制說明
strcpystrncpy複製,strncpy 不保證以 \0 結尾
strcatstrncat拼接,strncat 保證以 \0 結尾
strcmpstrncmp比較,返回 <0, 0, >0
strlen-計算長度(不含 \0),返回 size_t

原則:優先使用標準庫函數(常經過汇編優化),避免手寫循環。

第五部分:指針數組 vs 數組指針

int *p[5];      // 指針數組:5 個 int* 元素
int (*p)[5];    // 數組指針:指向含 5 個 int 的數組
int (*p)[3][4]; // 指向 3x4 二維數組

函數參數退化規則:

void f(int a[]);        // 等價 void f(int *a);
void f(int a[][5]);     // 等價 void f(int (*a)[5]); // 第二維必須給定
void f(int a[][5][6]);  // 等價 void f(int (*a)[5][6]);

第六部分:多維數組與多級指針

二維數組內存佈局

行優先連續存儲。int a[3][4] 在內存中為 12 個連續 int。

動態分配二維數組

// 方法1:單塊連續內存 + 指針數組
int (*p)[4] = malloc(3 * sizeof(int[4])); // p 為數組指針
// 方法2:指針數組 + 分行分配(非連續)
int **p = malloc(3 * sizeof(int*));
for (int i=0;i<3;i++) p[i] = malloc(4 * sizeof(int));

第七部分:函數指針與回調

聲明

int (*cmp)(const void*, const void*); // 函數指針類型
typedef int (*CmpFunc)(const void*, const void*); // 別名

回調模式

void sort(void *base, size_t n, size_t sz, CmpFunc cmp) {
    // ...
    if (cmp(a, b) > 0) swap(...);
}
// 調用
sort(arr, n, sizeof(int), int_cmp);

實現調用者與具體比較邏輯解耦。

第八部分:動態內存管理

核心函數

函數作用注意
malloc(size)分配未初始化內存失敗返回 NULL,必須檢查
calloc(n, size)分配並零初始化防止整數溢出,內部乘法
realloc(ptr, new_size)調整大小可能移動內存,必須用返回值更新指針
free(ptr)釋放釋放後置 NULL 防野指針

第九部分:程序內存四區

  • 棧:函數調用幀、局部變量、參數、返回地址。自動管理,大小有限(通常 1-8MB)。
  • 堆:動態分配內存,手動管理,大小受虛擬內存限制。
  • 靜態/全局區:全局變量、static 變量、字符串常量。程序啟動分配,結束釋放。
  • 代碼/常量區:二進制指令、只讀數據(如字符串字面量)。

第十部分:常見錯誤與防範

總結

指針與內存管理是 C 語言的核心也是難點。理解內存四區模型、掌握指針運算規則、熟練使用動態分配與釋放、養成防禦性編程習慣(檢查返回值、邊界、置 NULL),是寫出高效、健壯 C 代碼的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
錯誤類型表現防範措施
野指針指向已釋放/未初始化/超出作用域內存初始化為 NULL,free 後置 NULL,避免返回局部變量地址
內存洩漏malloc 無對應 free所有權清晰,RAII 模式,工具檢測
越界訪問數組下標超界邊界檢查,使用柔性數組/結構體封裝長度
雙重釋放同一指針 free 兩次free 後置 NULL,智能指針思想