訂閱
糾錯
加入自媒體

C指針:8 個關(guān)于指針的用法

一、前言

二、八個示例

   1. 修改主調(diào)函數(shù)中的數(shù)據(jù)

   2. 在被調(diào)用函數(shù)中,分配系統(tǒng)資源

   3. 傳遞函數(shù)指針

   4. 指向結(jié)構(gòu)體的指針

   5. 函數(shù)指針數(shù)組

   6. 柔性數(shù)組

   7. 通過指針來獲取結(jié)構(gòu)體中成員變量的偏移量( offsetof 宏定義)

   8. 通過結(jié)構(gòu)體中成員變量的指針,來獲取該結(jié)構(gòu)體的指針(container_of 宏定義)

三、總結(jié)

一、前言

半個月前寫的那篇關(guān)于指針最底層原理的文章,得到了很多朋友的認(rèn)可(鏈接: C語言指針-從底層原理到花式技巧,用圖文和代碼幫你講解透徹),特別是對剛學(xué)習(xí)C語言的小伙伴來說,很容易就從根本上理解指針到底是什么、怎么用,這也讓我堅信一句話;用心寫出的文章,一定會被讀者感受到!在寫這篇文章的時候,我列了一個提綱,寫到后面的時候,發(fā)現(xiàn)已經(jīng)超過一萬字了,但是提綱上還有最后一個主題沒有寫。如果繼續(xù)寫下去,文章體積就太大了,于是就留下了一個尾巴。

今天,我就把這個尾巴給補(bǔ)上去:主要是介紹指針在應(yīng)用程序的編程中,經(jīng)常使用的技巧。如果之前的那篇文章勉強(qiáng)算是“道”層面的話,那這篇文章就屬于“術(shù)”的層面。主要通過 8 個示例程序來展示在 C 語言應(yīng)用程序中,關(guān)于指針使用的常見套路,希望能給你帶來收獲。

記得我在校園里學(xué)習(xí)C語言的時候,南師大的黃鳳良老師花了大半節(jié)課的時間給我們解釋指針,現(xiàn)在最清楚地記得老師說過的一句話就是:指針就是地址,地址就是指針!

二、八個示例 

1. 開胃菜:修改主調(diào)函數(shù)中的數(shù)據(jù)// 交換 2 個 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);}

這個代碼不用解釋了,大家一看就明白。如果再過多解釋的話,好像在侮辱智商。

2. 在被調(diào)用函數(shù)中,分配系統(tǒng)資源

代碼的目的是:在被調(diào)用函數(shù)中,從堆區(qū)分配 size 個字節(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;
   // 錯誤用法    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 錯誤用法

剛進(jìn)入被調(diào)用函數(shù) demo2_malloc_h(yuǎn)eap_error 的時候,形參 buff 是一個 char* 型指針,它的值等于 pData 變量的值,也就是說 buff 與 pData 的值相同(都為 NULL),內(nèi)存模型如圖:

在被調(diào)用函數(shù)中執(zhí)行 malloc 語句之后,從堆區(qū)申請得到的地址空間賦值給 buf,就是說它就指向了這個新的地址空間,而 pData 里仍然是NULL,內(nèi)存模型如下:

從圖中可以看到,pData 的內(nèi)存中一直是 NULL,沒有指向任何堆空間。另外,由于形參 buf 是放在函數(shù)的棧區(qū)的,從被調(diào)函數(shù)中返回的時候,堆區(qū)這塊申請的空間就被泄漏了。

2.2 正確用法

剛進(jìn)入被調(diào)用函數(shù) demo2_malloc_h(yuǎn)eap_error 的時候,形參 buf 是一個 char* 型的二級指針,就是說 buf 里的值是另一個指針變量的地址,在這個示例中 buf 里的值就是 pData 這個指針變量的地址,內(nèi)存模型如下:

在被調(diào)用函數(shù)中執(zhí)行 malloc 語句之后,從堆區(qū)申請得到的地址空間賦值給 *buf,因為 buf = &pData,所以 *buf 就相當(dāng)于是 pData,那么從堆區(qū)申請得到的地址空間就賦值 pData 變量,內(nèi)存模型如下:

從被調(diào)函數(shù)中返回之后,pData 就正確的得到了一塊堆空間,別忘了使用之后要主動釋放。

1  2  下一頁>  
聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

    人工智能 獵頭職位 更多
    掃碼關(guān)注公眾號
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯
    x
    *文字標(biāo)題:
    *糾錯內(nèi)容:
    聯(lián)系郵箱:
    *驗 證 碼:

    粵公網(wǎng)安備 44030502002758號