新聞中心
簡(jiǎn)單認(rèn)識(shí)一下void
今天跟大家介紹的知識(shí)是C語(yǔ)言中的void關(guān)鍵字的用法,void在大部分小伙伴的程序中都只是用于函數(shù)無(wú)參數(shù)傳入,或者無(wú)類型返回。然而我們平時(shí)所定義的變量都會(huì)有具體的類型,int,float,char等等,那是否有void類型的變量呢?答案是:不行,編譯會(huì)出錯(cuò)。如下測(cè)試代碼:

上圖很明顯編譯器不允許定義void類型的變量,變量都是需要占用一定內(nèi)存的,既然void表示無(wú)類型,編譯器自然也就不知道該為其分配多大的內(nèi)存,于是造成編譯失敗。雖然void不能直接修飾變量,但是其可以用于修飾指針的指向即無(wú)類型指針void*,無(wú)類型指針那就有意義了,無(wú)類型指針不是一定要指向無(wú)類型數(shù)據(jù),而是可以指向任意類型的數(shù)據(jù)。
void * 基本操作
大家其實(shí)在使用動(dòng)態(tài)內(nèi)存分配的使用就已經(jīng)遇到了void *的使用,來(lái)我們一起看看如下幾個(gè)標(biāo)準(zhǔn)函數(shù)的原型定義:
- void* memcpy( void* _Dst, void const* _Src,size_t _Size);
- int memcmp(void const* _Buf1,void const* _Buf2, size_t _Size);
- void* memset(void* _Dst,int _Val,size_t _Size );
- void* malloc(size_t _Size);
- void* realloc( void* _Block,size_t _Size );
- void* calloc(size_t _Count,size_t _Size);
- void free( void* _Block );
上面這些函數(shù)都是與內(nèi)存操作有關(guān)的函數(shù),而void* 類型指針使用原則是: 必須要做強(qiáng)制類型轉(zhuǎn)換成為目標(biāo)類型后才可以使用,如下測(cè)試代碼:
- #include
- #include
- #include
- int main()
- {
- int num = 0;
- void* pVoid = #
- printf("%d", *(int*)pVoid); //解引用前 必須強(qiáng)制類型轉(zhuǎn)換
- int* p = (int*)malloc(4); //賦值給目標(biāo)指針 做類型轉(zhuǎn)換
- return 0;
- }
使用void * 實(shí)現(xiàn)無(wú)類型數(shù)據(jù)封裝
void既然如此的靈活一定大有用處,如果僅僅只是用來(lái)簡(jiǎn)單地傳遞參數(shù)似乎有點(diǎn)大材小用,我們得把其用到上層的軟件設(shè)計(jì)上來(lái)。在一些項(xiàng)目中因?yàn)閿?shù)據(jù)類型的不同導(dǎo)致重復(fù)編寫大量相同代碼,為了避免這個(gè)問(wèn)題C++引入了模板這個(gè)模塊,C語(yǔ)言可以通過(guò)void* 類型的指針來(lái)完成,按下面我們以一個(gè)例子來(lái)跟大家介紹一種辦法能夠減少數(shù)據(jù)類型變化所帶來(lái)的程序重復(fù)代碼的增加。
- #include
- #include
- /**********************************************
- * 代碼長(zhǎng)記不住怎么辦?
- * 點(diǎn)贊關(guān)注轉(zhuǎn)發(fā)
- * 這真的對(duì)我很重要
- **********************************************/
- typedef struct _tag_Add
- {
- int a;
- int b;
- int result;
- }sAdd;
- void Add(void* param)
- {
- sAdd * p = (sAdd*)param;
- p->result = p->a + p->b;
- }
- typedef struct _tag_Mul
- {
- float a;
- float b;
- float result;
- }sMul;
- void Mul(void* param)
- {
- sMul * p = (sMul*)param;
- p->result = p->a * p->b;
- }
- void sCal(void* param, void* fuc)
- {
- ((void(*)(void*))fuc)(param);
- }
- int main(void)
- {
- sAdd stAdd;
- sMul stMul;
- //數(shù)據(jù)初始化
- stAdd.a = 10;
- stAdd.b = 20;
- stMul.a = 5;
- stMul.b = 5;
- //接口直接用
- sCal(&stAdd, Add);
- sCal(&stMul, Mul);
- //對(duì)應(yīng)的輸出
- printf("a + b = %d\n", stAdd.result);
- printf("a * b = %f\n", stMul.result);
- return 0;
- }
上面的例子可能還是無(wú)法完全彰顯void*的強(qiáng)悍之處了,不過(guò)其主要的作用就是為了隱藏?cái)?shù)據(jù)類型,大家也可以理解為一種數(shù)據(jù)類型的抽象處理,這也是面向?qū)ο缶幊痰囊环N體現(xiàn)。
最后小結(jié)
對(duì)于void這個(gè)關(guān)鍵字的使用先講這么多吧!大家一定要記得對(duì)于一些編程技巧一定要嘗試著去使用,可能達(dá)到項(xiàng)目目標(biāo)的方式有很多種,但是一些好的設(shè)計(jì)不僅僅會(huì)讓你的代碼增色不少,同時(shí)也會(huì)讓同事們覺(jué)得你是一個(gè)喜歡專研技術(shù)的人。
新聞標(biāo)題:什么是萬(wàn)能指針?詳解C語(yǔ)言萬(wàn)能指針的妙用
瀏覽路徑:http://www.dlmjj.cn/article/dppseci.html


咨詢
建站咨詢
