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

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
3月27日立即報(bào)名>> 【工程師系列】汽車(chē)電子技術(shù)在線大會(huì)
-
4月30日立即下載>> 【村田汽車(chē)】汽車(chē)E/E架構(gòu)革新中,新智能座艙挑戰(zhàn)的解決方案
-
5月15-17日立即預(yù)約>> 【線下巡回】2025年STM32峰會(huì)
-
即日-5.15立即報(bào)名>>> 【在線會(huì)議】安森美Hyperlux™ ID系列引領(lǐng)iToF技術(shù)革新
-
5月15日立即下載>> 【白皮書(shū)】精確和高效地表征3000V/20A功率器件應(yīng)用指南
-
5月16日立即參評(píng) >> 【評(píng)選啟動(dòng)】維科杯·OFweek 2025(第十屆)人工智能行業(yè)年度評(píng)選
推薦專(zhuān)題
-
10 月之暗面,絕地反擊
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開(kāi)始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 “AI寒武紀(jì)”爆發(fā)至今,五類(lèi)新物種登上歷史舞臺(tái)
- 4 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 5 國(guó)產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計(jì)算迎來(lái)商業(yè)化突破,但落地仍需時(shí)間
- 7 東陽(yáng)光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開(kāi)成長(zhǎng)空間
- 8 地平線自動(dòng)駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營(yíng)收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?