C指針:8 個關于指針的用法
一、前言
二、八個示例
1. 修改主調函數中的數據
2. 在被調用函數中,分配系統(tǒng)資源
3. 傳遞函數指針
4. 指向結構體的指針
5. 函數指針數組
6. 柔性數組
7. 通過指針來獲取結構體中成員變量的偏移量( offsetof 宏定義)
8. 通過結構體中成員變量的指針,來獲取該結構體的指針(container_of 宏定義)
三、總結
一、前言
半個月前寫的那篇關于指針最底層原理的文章,得到了很多朋友的認可(鏈接: C語言指針-從底層原理到花式技巧,用圖文和代碼幫你講解透徹),特別是對剛學習C語言的小伙伴來說,很容易就從根本上理解指針到底是什么、怎么用,這也讓我堅信一句話;用心寫出的文章,一定會被讀者感受到!在寫這篇文章的時候,我列了一個提綱,寫到后面的時候,發(fā)現已經超過一萬字了,但是提綱上還有最后一個主題沒有寫。如果繼續(xù)寫下去,文章體積就太大了,于是就留下了一個尾巴。
今天,我就把這個尾巴給補上去:主要是介紹指針在應用程序的編程中,經常使用的技巧。如果之前的那篇文章勉強算是“道”層面的話,那這篇文章就屬于“術”的層面。主要通過 8 個示例程序來展示在 C 語言應用程序中,關于指針使用的常見套路,希望能給你帶來收獲。
記得我在校園里學習C語言的時候,南師大的黃鳳良老師花了大半節(jié)課的時間給我們解釋指針,現在最清楚地記得老師說過的一句話就是:指針就是地址,地址就是指針!
二、八個示例
1. 開胃菜:修改主調函數中的數據// 交換 2 個 int 型數據void demo1_swap_data(int *a, int *b){ int tmp = *a; *a = *b; *b = tmp;}
void demo1(){ int i = 1; int j = 2; printf("before: i = %d, j = %d ", i, j); demo1_swap_data(&i, &j); printf("after: i = %d, j = %d ", i, j);}
這個代碼不用解釋了,大家一看就明白。如果再過多解釋的話,好像在侮辱智商。
2. 在被調用函數中,分配系統(tǒng)資源
代碼的目的是:在被調用函數中,從堆區(qū)分配 size 個字節(jié)的空間,返回給主調函數中的 pData 指針。
void demo2_malloc_heap_error(char *buf, int size){ buf = (char *)malloc(size); printf("buf = 0x%x ", buf);}
void demo2_malloc_heap_ok(char **buf, int size){ *buf = (char *)malloc(size); printf("*buf = 0x%x ", *buf);}
void demo2(){ int size = 1024; char *pData = NULL;
// 錯誤用法 demo2_malloc_heap_error(pData, size); printf("&pData = 0x%x, pData = 0x%x ", &pData, pData);
// 正確用法 demo2_malloc_heap_ok(&pData, size); printf("&pData = 0x%x, pData = 0x%x ", &pData, pData); free(pData);}2.1 錯誤用法
剛進入被調用函數 demo2_malloc_heap_error 的時候,形參 buff 是一個 char* 型指針,它的值等于 pData 變量的值,也就是說 buff 與 pData 的值相同(都為 NULL),內存模型如圖:
在被調用函數中執(zhí)行 malloc 語句之后,從堆區(qū)申請得到的地址空間賦值給 buf,就是說它就指向了這個新的地址空間,而 pData 里仍然是NULL,內存模型如下:
從圖中可以看到,pData 的內存中一直是 NULL,沒有指向任何堆空間。另外,由于形參 buf 是放在函數的棧區(qū)的,從被調函數中返回的時候,堆區(qū)這塊申請的空間就被泄漏了。
2.2 正確用法
剛進入被調用函數 demo2_malloc_heap_error 的時候,形參 buf 是一個 char* 型的二級指針,就是說 buf 里的值是另一個指針變量的地址,在這個示例中 buf 里的值就是 pData 這個指針變量的地址,內存模型如下:
在被調用函數中執(zhí)行 malloc 語句之后,從堆區(qū)申請得到的地址空間賦值給 *buf,因為 buf = &pData,所以 *buf 就相當于是 pData,那么從堆區(qū)申請得到的地址空間就賦值 pData 變量,內存模型如下:
從被調函數中返回之后,pData 就正確的得到了一塊堆空間,別忘了使用之后要主動釋放。

請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
推薦專題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達AI統(tǒng)治的開始
- 2 北電數智主辦酒仙橋論壇,探索AI產業(yè)發(fā)展新路徑
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 “AI寒武紀”爆發(fā)至今,五類新物種登上歷史舞臺
- 5 國產智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計算迎來商業(yè)化突破,但落地仍需時間
- 7 東陽光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開成長空間
- 8 地平線自動駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營收大增主靠小件,虧損繼續(xù)又逢關稅,能否乘機器人東風翻身?