最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

C語言中神奇的指針,愛它又恨它,C語言精華解析之萬能指針

2020-05-11 15:50 作者:C語言基礎(chǔ)  | 我要投稿

C語言中神奇的指針,愛它又恨它,C語言精華解析之萬能指針



什么是萬能指針?

萬能指針其實就是void *類型的指針,而void *指針一般被稱為通用指針或叫泛指針。它是C語言關(guān)于純粹地址的一種約定。當(dāng)某個指針是void型指針時,所指向的對象不屬于任何類型。 因為void指針不屬于任何類型,不可以對其進行算術(shù)運算,比如自增,編譯器不知道其自增需要增加多少。


而對于char *型指針,自增一定是指針指向的地址加1,int*型指針自增,則偏移4。這個在指針的運算中p+n的解釋中已經(jīng)很詳細(xì)的介紹過,這里不再累贅,有興趣的可以自行查閱。

在C/C++中,在任意時刻都可以使用其它類型指針來代替void指針,或者用void指針來代替其他類型指針。?這樣就可以衍生出很多比較有用的技巧。指針的本質(zhì),是其值為一個地址,那么延伸一下: 當(dāng)使用關(guān)鍵字void聲明指針變量時,它將成為通用指針變量。任何數(shù)據(jù)類型(char,int,float等)的任何變量的地址都可以賦值給void指針變量。這就是為什么把它稱之為萬能指針了。

萬能指針使用規(guī)則

  1. 使用前必須被初始化

  2. 解引用過程必須強制轉(zhuǎn)換

萬能指針能被任何類型指針初始化,萬能指針也和其他類型指針一樣,可以當(dāng)做函數(shù)參數(shù),函數(shù)返回值,以及充當(dāng)函數(shù)指針皆可。

萬能指針操作基本數(shù)據(jù)類型

對指針變量的解引用,使用間接運算符*達到目的。但是在使用空指針的情況下,需要轉(zhuǎn)換指針變量以解引用。這是因為空指針沒有與之關(guān)聯(lián)的數(shù)據(jù)類型。編譯器無法知道void指針指向的數(shù)據(jù)類型。因此,要獲取由void指針指向的數(shù)據(jù),需要使用在void指針位置內(nèi)保存的正確類型的數(shù)據(jù)進行類型轉(zhuǎn)換。


萬能指針充當(dāng)函數(shù)返回值

萬能指針充當(dāng)函數(shù)返回值直接看下庫中提供的動態(tài)內(nèi)存申請函數(shù)即可,自己想要寫的話稍微麻煩些,動態(tài)申請內(nèi)存函數(shù)如下:

void *malloc(size_t size); ? ? //size_t: unsigned int
void *calloc(size_t count,size_t size); //申請具備初始化功能,malloc無此功能

而我們在實用的時候為什么要強制轉(zhuǎn)換就一目了然了。


萬能指針充當(dāng)函數(shù)參數(shù)

當(dāng)我們想要設(shè)計一個可以傳入任何類型的指針的函數(shù)的時候,我們就可以把參數(shù)設(shè)計為void *類型,而對于這類函數(shù),內(nèi)存的重新申請realloc函數(shù)其實也是void *的參數(shù),很多操作內(nèi)存的函數(shù),參數(shù)設(shè)計其實都是void *類型的指針,如果你對于C語言掌握的可以,我相信下面兩個函數(shù)你應(yīng)該都了解過:

void *realloc(void *pVoid,size_t size); //重新申請內(nèi)存
void *memset(void *pVoid,int value ,size_t size); //設(shè)置一段內(nèi)存的值

萬能指針充當(dāng)函數(shù)指針調(diào)用函數(shù)

雖說萬能指針充當(dāng)函數(shù)指針調(diào)用函數(shù)的方式真正自己開發(fā)的時候很少用,但是有幸我的學(xué)生面試的時候就遇到過這樣的一道筆試題,所以在這里就給大家講解下,如下代碼,實現(xiàn)通過萬能指針對函數(shù)的調(diào)用:


別人會問題 (*(void(*)())pVoid)()是做什么的? 初看,大家是不是滿腦子黑人問號?其實結(jié)合上面的代碼看,就知道其實就是一個無返回值無參函數(shù)通過萬能指針調(diào)用而已??季康臒o非以下C語言知識:

  1. 函數(shù)指針調(diào)用函數(shù): (*函數(shù)指針名)(參數(shù)表);

  2. 強制轉(zhuǎn)換語法:(目標(biāo)類型)變量

  3. 指針的類型: 去掉變量名剩下的就是指針的類型

而對函數(shù)print的函數(shù)指針是 :void (*p)() ,其實就是用(*p)替換函數(shù)名,就是該函數(shù)的函數(shù)指針,所以去掉變量名剩下的就是指針的類型,即:void (*)() ,然后pVoid 調(diào)用函數(shù)的方式: (*pVoid)(); 然后把類型拿過來強制轉(zhuǎn)換即可得到:(*(void(*)())pVoid)(),明白了吧!就這么簡單。

ps: 在單片機開發(fā)中,萬能指針往往用來實現(xiàn)數(shù)據(jù)的非易失存儲。所謂非易失存儲,就是數(shù)據(jù)改寫后在掉電后仍然能保持。有興趣的可以自我拓展下哦

C語言中神奇的指針,愛它又恨它,C語言精華解析之萬能指針的評論 (共 條)

分享到微博請遵守國家法律
汤阴县| 拉萨市| 重庆市| 应用必备| 兴海县| 南阳市| 苍溪县| 招远市| 文化| 普安县| 孝昌县| 孙吴县| 达尔| 英德市| 余姚市| 专栏| 英山县| 五台县| 宜州市| 长治县| 白玉县| 北安市| 郎溪县| 德江县| 苏尼特左旗| 扎鲁特旗| 高安市| 察隅县| 伊金霍洛旗| 康定县| 措美县| 廊坊市| 高雄市| 巴中市| 渭南市| 盐山县| 富源县| 商河县| 应城市| 安仁县| 孟州市|