C語言二級指針與多級指針的實現(xiàn)
指針是C語言的靈魂,而多級指針則是靈魂深處的奧秘。理解它們,你將真正掌握C語言內(nèi)存操控的核心能力。
一、指針的本質(zhì):內(nèi)存地址的容器
在深入多級指針前,讓我們先回顧指針的核心概念:
int value = 42; // 整型變量 int *ptr = &value; // 一級指針:存儲value的地址
內(nèi)存結構示意圖:
[value] 0x1000: 42 [ptr] 0x2000: 0x1000 ← 存儲value的地址
二、二級指針:指向指針的指針
1. 基本概念
int **pptr = &ptr; // 二級指針:存儲ptr的地址
2. 內(nèi)存結構圖解
┌───────────┐ ┌───────────┐ ┌───────────┐ │ 0x3000 │ ──→ │ 0x2000 │ ──→ │ 0x1000 │ ├───────────┤ ├───────────┤ ├───────────┤ │ pptr │ │ ptr │ │ value │ │ (int**) │ │ (int*) │ │ (int) │ └───────────┘ └───────────┘ └───────────┘ 二級指針 一級指針 整型值
3. 訪問路徑解析
*pptr; // 解引用一次:獲取ptr的值 (0x2000 → 0x1000) **pptr; // 解引用兩次:獲取value的值 (0x2000 → 0x1000 → 42)
三、三級指針:深入一層的內(nèi)存導航
int ***ppptr = &pptr; // 三級指針
內(nèi)存結構圖解:
┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ 0x4000 │ ──→ │ 0x3000 │ ──→ │ 0x2000 │ ──→ │ 0x1000 │ ├───────────┤ ├───────────┤ ├───────────┤ ├───────────┤ │ ppptr │ │ pptr │ │ ptr │ │ value │ │ (int***) │ │ (int**) │ │ (int*) │ │ (int) │ └───────────┘ └───────────┘ └───────────┘ └───────────┘ 三級指針 二級指針 一級指針 整型值
訪問路徑:
***ppptr; // 三次解引用獲取value的值
四、為什么需要多級指針?四大核心應用場景
1. 動態(tài)二維數(shù)組的創(chuàng)建與釋放
// 創(chuàng)建3x4矩陣 int **matrix = (int**)malloc(3 * sizeof(int*)); for(int i=0; i<3; i++) { matrix[i] = (int*)malloc(4 * sizeof(int)); } // 釋放內(nèi)存 for(int i=0; i<3; i++) free(matrix[i]); free(matrix);
內(nèi)存結構圖解:
matrix → [0] → [0][0][0][0] [1] → [0][0][0][0] [2] → [0][0][0][0]
2. 在函數(shù)中修改指針的指向
void allocate(int **p) { *p = (int*)malloc(sizeof(int)); // 修改外部指針的指向 **p = 100; // 設置值 } int main() { int *ptr = NULL; allocate(&ptr); // 傳遞指針的地址 printf("%d", *ptr); // 輸出100 free(ptr); }
3. 字符串數(shù)組的處理
char *names[] = {"Alice", "Bob", "Charlie"}; char **namePtr = names; // 二級指針指向字符串數(shù)組 // 遍歷輸出 for(; *namePtr != NULL; namePtr++) { printf("%s\n", *namePtr); }
4. 樹形數(shù)據(jù)結構操作
typedef struct TreeNode { int data; struct TreeNode *left; struct TreeNode *right; } TreeNode; // 使用三級指針在函數(shù)中修改樹節(jié)點 void insertNode(TreeNode ***rootPtr, int value) { if(!**rootPtr) { **rootPtr = (TreeNode*)malloc(sizeof(TreeNode)); (**rootPtr)->data = value; (**rootPtr)->left = (**rootPtr)->right = NULL; } else if(value < (**rootPtr)->data) insertNode(&((**rootPtr)->left), value); else insertNode(&((**rootPtr)->right), value); }
五、多級指針操作的核心法則
聲明規(guī)則:
- 一級指針:
type *ptr
- 二級指針:
type **ptr
- 三級指針:
type ***ptr
解引用深度:
int value = 42; int *p1 = &value; int **p2 = &p1; int ***p3 = &p2; ***p3 == **p2 == *p1 == value // 全部等于42
類型匹配原則:
int *p1; int **p2 = &p1; // 正確:p2是指向int*的指針 float *fp; int **p3 = &fp; // 錯誤:類型不匹配
六、多級指針的常見錯誤與陷阱
解引用層級錯誤:
int value = 10; int **pp = (int**)&value; // 危險的類型轉換 printf("%d", **pp); // 崩潰:嘗試將10解釋為地址
內(nèi)存泄漏鏈:
int **matrix = malloc(3 * sizeof(int*)); // 忘記釋放每個子數(shù)組 → 內(nèi)存泄漏 free(matrix); // 只釋放了第一層
空指針解引用:
int **pp = NULL; *pp = malloc(sizeof(int)); // 崩潰:嘗試解引用NULL
到此這篇關于C語言二級指針與多級指針的實現(xiàn)的文章就介紹到這了,更多相關C語言二級指針與多級指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Qt?QtCreator添加自定義注釋的實現(xiàn)方法
在寫代碼的時候我們?yōu)榱艘?guī)范化,一般會加文件注釋、類注釋和函數(shù)注釋,本文主要介紹了Qt?QtCreator添加自定義注釋的實現(xiàn)方法,具有一定的參考價值,感興趣的可以了解一下2023-11-11Qt創(chuàng)建SQlite數(shù)據(jù)庫的示例代碼
本文主要介紹了Qt創(chuàng)建SQlite數(shù)據(jù)庫的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-05-05基于OpenCV自定義色條實現(xiàn)灰度圖上色功能代碼
今天通過本文給大家分享基于OpenCV自定義色條實現(xiàn)灰度圖上色功能代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-11-11VS2019安裝配置MFC(安裝vs2019時沒有安裝mfc)
這篇文章主要介紹了VS2019安裝配置MFC(安裝vs2019時沒有安裝mfc),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03實戰(zhàn)開發(fā)為單片機的按鍵加一個鎖防止多次觸發(fā)的細節(jié)
今天小編就為大家分享一篇關于實戰(zhàn)開發(fā)為單片機的按鍵加一個鎖防止多次觸發(fā)的細節(jié),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12