C語言使用void *類型作為函數(shù)形參
相信大家已經(jīng)見識(shí)過C語言的厲害之處,但這也是最燒腦的地方,即高自由度產(chǎn)生的高不可控性。假如有這樣一種場(chǎng)景:功能差不多,但受限于參數(shù)類型,寫了多個(gè)函數(shù)。
此時(shí)可以使用void *類型傳遞參數(shù),然后在函數(shù)內(nèi)部對(duì)類型進(jìn)行判斷,切換到不同數(shù)據(jù)類型處理不同的數(shù)據(jù)。
為實(shí)現(xiàn)功能,要實(shí)現(xiàn)以下內(nèi)容:
????枚舉1:定義數(shù)據(jù)類型
????枚舉2:定義數(shù)據(jù)類型的長度
????測(cè)試函數(shù)聲明
????main函數(shù)
????測(cè)試函數(shù)實(shí)現(xiàn)
看上去可行,讓我們嘗試寫出代碼。
使用枚舉定義數(shù)據(jù)類型
使用結(jié)構(gòu)體定義一些數(shù)據(jù)
使用枚舉定義數(shù)據(jù)結(jié)構(gòu)體數(shù)據(jù)類型長度
測(cè)試函數(shù)聲明
測(cè)試函數(shù)實(shí)現(xiàn)
結(jié)構(gòu)體變量賦值
使用結(jié)構(gòu)體指針
函數(shù)調(diào)用
結(jié)合起來,得到了最終代碼
輸出結(jié)果:
讓我們來看看測(cè)試函數(shù)聲明:
void *data為任意類型指針,void不是此時(shí)不是空的含義,而是“任意”的含義,可以將其進(jìn)行類型轉(zhuǎn)換。
enum datatype type是枚舉數(shù)據(jù)類型,更確切的說是enum datatype類型,type是類型的變量,函數(shù)的形參。
int datalength是數(shù)據(jù)類型的長度,也可以直接使用枚舉類型傳遞給int datalength,因?yàn)樵诰幾g的某個(gè)階段,枚舉就像宏展開一樣被替換掉,但枚舉只能為整型,宏可以為其他類型,這也是為什么調(diào)用test函數(shù)時(shí),可以直接使用枚舉,放在int datalength形參的位置。
測(cè)試函數(shù)的實(shí)現(xiàn)
本打算使用malloc重新分配一塊內(nèi)存進(jìn)行使用,但發(fā)現(xiàn)冒號(hào)后面不能聲明變量,只能執(zhí)行語句,{加了大括號(hào)括起來就可以了},據(jù)說代碼塊概念來自于lisp語言,本想使用malloc分配一塊內(nèi)存,再進(jìn)行強(qiáng)制轉(zhuǎn)換,經(jīng)過查閱資料,不使用malloc照樣可以使用,這是因?yàn)樽兞棵恍枰峙鋬?nèi)存空間。那么僅剩最后一個(gè)問題,將void *類型轉(zhuǎn)化為其他類型指針,可switch case已經(jīng)幫我們選擇的類型,如果再強(qiáng)制轉(zhuǎn)換是不是多此一舉,但不轉(zhuǎn)換又沒法使用,那怎么辦?
有一種很直接的辦法--直接賦值,將void *類型賦值給 int *、char *或者float *都是可以的。
然后使用新的指針即可