c语言 万能函数指针,C/C++编程笔记:C语言精华解析之void *指针,指针中的万能指针...
什么是萬能指針?
萬能指針其實(shí)就是void *類型的指針,而void *指針一般被稱為通用指針或叫泛指針。它是C語言關(guān)于純粹地址的一種約定。當(dāng)某個(gè)指針是void型指針時(shí),所指向的對(duì)象不屬于任何類型。 因?yàn)関oid指針不屬于任何類型,不可以對(duì)其進(jìn)行算術(shù)運(yùn)算,比如自增,編譯器不知道其自增需要增加多少。
而對(duì)于char *型指針,自增一定是指針指向的地址加1,int*型指針自增,則偏移4。這個(gè)在指針的運(yùn)算中p+n的解釋中已經(jīng)很詳細(xì)的介紹過,這里不再累贅,有興趣的可以自行查閱。
在C/C++中,在任意時(shí)刻都可以使用其它類型指針來代替void指針,或者用void指針來代替其他類型指針。?這樣就可以衍生出很多比較有用的技巧。指針的本質(zhì),是其值為一個(gè)地址,那么延伸一下: 當(dāng)使用關(guān)鍵字void聲明指針變量時(shí),它將成為通用指針變量。任何數(shù)據(jù)類型(char,int,float等)的任何變量的地址都可以賦值給void指針變量。這就是為什么把它稱之為萬能指針了。
萬能指針使用規(guī)則
(1)使用前必須被初始化
(2)解引用過程必須強(qiáng)制轉(zhuǎn)換
萬能指針能被任何類型指針初始化,萬能指針也和其他類型指針一樣,可以當(dāng)做函數(shù)參數(shù),函數(shù)返回值,以及充當(dāng)函數(shù)指針皆可。
萬能指針操作基本數(shù)據(jù)類型
對(duì)指針變量的解引用,使用間接運(yùn)算符*達(dá)到目的。但是在使用空指針的情況下,需要轉(zhuǎn)換指針變量以解引用。這是因?yàn)榭罩羔槢]有與之關(guān)聯(lián)的數(shù)據(jù)類型。編譯器無法知道void指針指向的數(shù)據(jù)類型。因此,要獲取由void指針指向的數(shù)據(jù),需要使用在void指針位置內(nèi)保存的正確類型的數(shù)據(jù)進(jìn)行類型轉(zhuǎn)換。
萬能指針充當(dāng)函數(shù)返回值
萬能指針充當(dāng)函數(shù)返回值直接看下庫中提供的動(dòng)態(tài)內(nèi)存申請(qǐng)函數(shù)即可,自己想要寫的話稍微麻煩些,動(dòng)態(tài)申請(qǐng)內(nèi)存函數(shù)如下:
而我們?cè)趯?shí)用的時(shí)候?yàn)槭裁匆獜?qiáng)制轉(zhuǎn)換就一目了然了。
萬能指針充當(dāng)函數(shù)參數(shù)
當(dāng)我們想要設(shè)計(jì)一個(gè)可以傳入任何類型的指針的函數(shù)的時(shí)候,我們就可以把參數(shù)設(shè)計(jì)為void *類型,而對(duì)于這類函數(shù),內(nèi)存的重新申請(qǐng)realloc函數(shù)其實(shí)也是void *的參數(shù),很多操作內(nèi)存的函數(shù),參數(shù)設(shè)計(jì)其實(shí)都是void *類型的指針,如果你對(duì)于C語言掌握的可以,我相信下面兩個(gè)函數(shù)你應(yīng)該都了解過:
萬能指針充當(dāng)函數(shù)指針調(diào)用函數(shù)
雖說萬能指針充當(dāng)函數(shù)指針調(diào)用函數(shù)的方式真正自己開發(fā)的時(shí)候很少用,但是有幸我的學(xué)生面試的時(shí)候就遇到過這樣的一道筆試題,所以在這里就給大家講解下,如下代碼,實(shí)現(xiàn)通過萬能指針對(duì)函數(shù)的調(diào)用:
別人會(huì)問題 (*(void(*)())pVoid)()是做什么的? 初看,大家是不是滿腦子黑人問號(hào)?其實(shí)結(jié)合上面的代碼看,就知道其實(shí)就是一個(gè)無返回值無參函數(shù)通過萬能指針調(diào)用而已。考究的無非以下C語言知識(shí):
(1)函數(shù)指針調(diào)用函數(shù): (*函數(shù)指針名)(參數(shù)表);
(2)強(qiáng)制轉(zhuǎn)換語法:(目標(biāo)類型)變量
(3)指針的類型: 去掉變量名剩下的就是指針的類型
而對(duì)函數(shù)print的函數(shù)指針是 :void (*p)() ,其實(shí)就是用(*p)替換函數(shù)名,就是該函數(shù)的函數(shù)指針,所以去掉變量名剩下的就是指針的類型,即:void (*)() ,然后pVoid 調(diào)用函數(shù)的方式: (*pVoid)(); 然后把類型拿過來強(qiáng)制轉(zhuǎn)換即可得到:(*(void(*)())pVoid)(),明白了吧!就這么簡單。
ps: 在單片機(jī)開發(fā)中,萬能指針往往用來實(shí)現(xiàn)數(shù)據(jù)的非易失存儲(chǔ)。所謂非易失存儲(chǔ),就是數(shù)據(jù)改寫后在掉電后仍然能保持。有興趣的可以自我拓展下哦!
自學(xué)C/C++編程難度很大,如果你想更快提升自己的編程能力和編寫項(xiàng)目的水平,歡迎一起共同成長!
C語言C++編程學(xué)習(xí)交流圈子,QQ群【757874045點(diǎn)擊進(jìn)入】微信公眾號(hào):C語言編程學(xué)習(xí)基地
有一些源碼和資料分享,歡迎轉(zhuǎn)行也學(xué)習(xí)編程的伙伴,和大家一起交流成長會(huì)比自己琢磨更快哦!
內(nèi)容來源于網(wǎng)絡(luò)如有侵權(quán)請(qǐng)私信刪除
總結(jié)
以上是生活随笔為你收集整理的c语言 万能函数指针,C/C++编程笔记:C语言精华解析之void *指针,指针中的万能指针...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国庆第七日(2014年10月7日17:5
- 下一篇: 汉字拼音相互转化(QT)