



下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、void的含義void即“無(wú)類型”,void*則為“無(wú)類型指針”,可以指向任何數(shù)據(jù)類型。void指針使用規(guī)范void指針可以指向任意類型的數(shù)據(jù),亦即可用任意數(shù)據(jù)類型的指針對(duì)void指針賦值。例如:int*pint;void*pvoid;pvoid=pint;/*不過(guò)不能pint=pvoid;*/如果要將pvoid賦給其他類型指針,則需要強(qiáng)制類型轉(zhuǎn)換如:pint=(int*)pvoid;在ANSIC標(biāo)準(zhǔn)中,不允許對(duì)void指針進(jìn)行算術(shù)運(yùn)算如pvoid+或pvoid+=l等,而在GNU中則允許,因?yàn)樵谌笔∏闆r下,GNU認(rèn)為void*與char*樣。sizeoff*pvoid)=sizeoffcha
2、r).void的作用對(duì)函數(shù)返回的限定。對(duì)函數(shù)參數(shù)的限定。當(dāng)函數(shù)不需要返回值時(shí),必須使用void限定。例如:voidfunc(int,int);當(dāng)函數(shù)不允許接受參數(shù)時(shí),必須使用void限定。例如:intfunc(void)。由于void指針可以指向任意類型的數(shù)據(jù),亦即可用任意數(shù)據(jù)類型的指針對(duì)void指針賦值,因此還可以用void指針來(lái)作為函數(shù)形參,這樣函數(shù)就可以接受任意數(shù)據(jù)類型的指針作為參數(shù)。例如:void*memcpy(void*dest,constvoid*src,size_tlen);void*memset(void*buffer;intc,size_tnum);許多初學(xué)者對(duì)C/C+語(yǔ)言中
3、的void及void指針類型不其理解,因此在使用上出現(xiàn)了一些錯(cuò)誤。本文將對(duì)void關(guān)鍵字的深刻含義進(jìn)行解說(shuō),并詳述void及void指針類型的使用方法與技巧。void的含義void的字面意思是“無(wú)類型”,void*則為“無(wú)類型指針”,void*可以指向任何類型的數(shù)據(jù)。void兒乎只有“注釋”和限制程序的作用,因?yàn)閺膩?lái)沒(méi)有人會(huì)定義一個(gè)void變量,讓我們?cè)囍鴣?lái)定義:voida;這行語(yǔ)句編譯時(shí)會(huì)出錯(cuò),提示illegaluseoftypevoid。不過(guò),即使voida的編譯不會(huì)出錯(cuò),它也沒(méi)有任何實(shí)際意義。void真正發(fā)揮的作用在于:對(duì)函數(shù)返回的限定;對(duì)函數(shù)參數(shù)的限定。眾所周知,如果指針pl和P2的類
4、型相同,那么我們可以直接在pl和P2間互相賦值;如果pl和p2指向不同的數(shù)據(jù)類型,則必須使用強(qiáng)制類型轉(zhuǎn)換運(yùn)算符把賦值運(yùn)算符右邊的指針類型轉(zhuǎn)換為左邊指針的類型。例如:float*pl;int*p2;Pl=P2;其中pl=p2語(yǔ)句會(huì)編譯出錯(cuò),提示=:cannotconvertfromint*tofloat*”,必須改為:pl=(float*)p2;而void*則不同,任何類型的指針都可以直接賦值給它,無(wú)需進(jìn)行強(qiáng)制類型轉(zhuǎn)換:void*pl;int*p2;Pl=P2;但這并不意味著,void*也可以無(wú)需強(qiáng)制類型轉(zhuǎn)換地賦給其它類型的指針。因?yàn)椤盁o(wú)類型”可以包容“有類型”,而“有類型”則不能包容“無(wú)類型”
5、。道理很簡(jiǎn)單,我們可以說(shuō)“男人和女人都是人”,但不能說(shuō)“人是男人”或者“人是女人”。下面的語(yǔ)句編譯出錯(cuò):void*pl;int*p2;P2=pl;提示=:cannotconvertfromvoid*toint*。3.void的使用下面給出void關(guān)鍵字的使用規(guī)則:規(guī)則一如果函數(shù)沒(méi)有返回值,那么應(yīng)聲明為void類型在C語(yǔ)言中,凡不加返回值類型限定的函數(shù),就會(huì)被編譯器作為返回整型值處理。但是許多程序員卻誤以為其為void類型。例如:add(inta,intb)returna+b;intmainfintargc,char*argv)printf(2+3=%d,add(2,3);程序運(yùn)行的結(jié)果為輸出:
6、2+3=5這說(shuō)明不加返回值說(shuō)明的函數(shù)的確為int函數(shù)。林銳博士高質(zhì)量C/C+編程中提到:“C+語(yǔ)言有很嚴(yán)格的類型安全檢查,不允許上述情況(指函數(shù)不加類型聲明)發(fā)生”??墒蔷幾g器并不一定這么認(rèn)定,譬如在VisualC+6.0中上述add函數(shù)的編譯無(wú)錯(cuò)也無(wú)警告且運(yùn)行正確,所以不能寄希望于編譯器會(huì)做嚴(yán)格的類型檢查。因此,為了避免混亂,我們?cè)诰帉慍/C+程序時(shí),對(duì)于任何函數(shù)都必須一個(gè)不漏地指定其類型。如果函數(shù)沒(méi)有返回值,一定要聲明為void類型。這既是程序良好可讀性的需要,也是編程規(guī)范性的要求。另外,加上void類型聲明后,也可以發(fā)揮代碼的“自注釋”作用。代碼的“自注釋”即代碼能自己注釋自己。Page
7、規(guī)則二如果函數(shù)無(wú)參數(shù),那么應(yīng)聲明其參數(shù)為void在C+語(yǔ)言中聲明一個(gè)這樣的函數(shù):intfunction(void)return1;則進(jìn)行下面的調(diào)用是不合法的:function(2);因?yàn)樵贑+中,函數(shù)參數(shù)為void的意思是這個(gè)函數(shù)不接受任何參數(shù)。我們?cè)赥urboC2.0中編譯:tfinclude”stdio.h”fun()return1;main()printftVdVJunfZ);getcharf);編譯正確且輸出1,這說(shuō)明,在(:語(yǔ)言中,可以給無(wú)參數(shù)的函數(shù)傳送任意類型的參數(shù),但是在C+編譯器中編譯同樣的代碼則會(huì)出錯(cuò)。在C+中,不能向無(wú)參數(shù)的函數(shù)傳送任何參數(shù),出錯(cuò)提示fun:function
8、doesnottake1parametersVo所以,無(wú)論在C還是C+中,若函數(shù)不接受任何參數(shù),一定要指明參數(shù)為void。規(guī)則三小心使用void指針類型按照ANSI(AmericanNationalStandardsInstitute)標(biāo)準(zhǔn),不能對(duì)void指針進(jìn)彳亍算法操作,即下列操作都是不合法的:void*pvoid;pvoid+;/ANSI:錯(cuò)誤pvoid+=1;/ANSI:錯(cuò)誤/ANSI標(biāo)準(zhǔn)之所以這樣認(rèn)定,是因?yàn)樗鼒?jiān)持:進(jìn)行算法操作的指針必須是確定知道其指向數(shù)據(jù)類型大小的。例如:int*pint;pint+;/ANSI:正確pint+的結(jié)果是使其增大sizeof(int)o但是大名鼎鼎的
9、GNU(GNUsNotUnix的縮寫)則不這么認(rèn)定,它指定void*的算法操作與char*一致。因此下列語(yǔ)句在GNU編譯器中皆正確:pvoid+;/GNU:正確pvoid+=1;/GNU:正確pvoid+的執(zhí)行結(jié)果是其增大了lo在實(shí)際的程序設(shè)計(jì)中,為迎合ANSI標(biāo)準(zhǔn),并提高程序的可移植性,我們可以這樣編寫實(shí)現(xiàn)同樣功能的代碼:void*pvoid;(char*)pvoid+;/ANSI:正確;GNU:正確(char*)pvoid+=1;/ANSI:錯(cuò)誤;GNU:正確GNU和ANSI還有一些區(qū)別,總體而言,GNU較ANSI更“開(kāi)放”,提供了對(duì)更多語(yǔ)法的支持。但是我們?cè)谡鎸?shí)設(shè)計(jì)時(shí),還是應(yīng)該盡可能地迎
10、合ANSI標(biāo)準(zhǔn)。規(guī)則四如果函數(shù)的參數(shù)可以是任意類型指針,那么應(yīng)聲明其參數(shù)為void*典型的如內(nèi)存操作函數(shù)memcpy和memset的函數(shù)原型分別為:void*memcpyfvoid*dest,constvoid*src,size_tlen);void*memset(void*buffer;intc,size_tnum);這樣,任何類型的指針都可以傳入memcpy和memset中,這也真實(shí)地體現(xiàn)了內(nèi)存操作函數(shù)的意義,因?yàn)樗僮鞯膶?duì)象僅僅是一片內(nèi)存,而不論這片內(nèi)存是什么類型。如果memcpy和memset的參數(shù)類型不是void*,而是char*,那才叫真的奇怪了!這樣的memcpy和memset明
11、顯不是一個(gè)“純粹的,脫離低級(jí)趣味的”函數(shù)!下面的代碼執(zhí)行正確:示例:memset接受任意類型指針intintarray100;Pagememset(intarray,0,100*sizeof(int);/將intarray清0示例:memcpy接受任意類型指針intintarrayl100,intarray2100;memcpy(intarrayl,intarray乙100*sizeof(int);/將intarrayZ拷貝給intarrayl有趣的是,memcpy和memset函數(shù)返回的也是void*類型,標(biāo)準(zhǔn)庫(kù)函數(shù)的編寫者是多么地富有學(xué)問(wèn)?。∫?guī)則五void不能代表一個(gè)真實(shí)的變量下面代碼都企圖讓void代表一個(gè)真實(shí)的變量,因此都是錯(cuò)誤的代碼:voida;錯(cuò)誤function(voida);/錯(cuò)誤void體現(xiàn)了一種抽象,這個(gè)世界上的變量都是“有類型”的,譬如一個(gè)人不是男人就是
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 遵義市習(xí)水縣招聘城鎮(zhèn)公益性崗位人員筆試真題2024
- 鑲黃旗內(nèi)蒙古贛鋒鋰業(yè)有限公司招聘筆試真題2024
- 2021年北京市高考生物試卷歷年真題試題答案解析
- 2024年北京大興區(qū)興豐街道招聘考試真題
- 電子產(chǎn)品開(kāi)發(fā)的質(zhì)量控制措施
- 江西省鷹潭市2025屆高三下學(xué)期第二次模擬考試語(yǔ)文試題及參考答案
- 2025年企業(yè)安全培訓(xùn)考試試題及參考答案【培優(yōu)】
- 2024-2025部門安全培訓(xùn)考試試題附參考答案(綜合卷)
- 2024-2025工廠職工安全培訓(xùn)考試試題附答案【研優(yōu)卷】
- 2025公司三級(jí)安全培訓(xùn)考試試題審定
- 統(tǒng)借統(tǒng)還合同協(xié)議
- 2025年上半年中國(guó)十五冶金建設(shè)集團(tuán)限公司公開(kāi)招聘中高端人才易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 養(yǎng)老院護(hù)理九防內(nèi)容課件
- CNASGL011-202X實(shí)驗(yàn)室和檢驗(yàn)機(jī)構(gòu)內(nèi)部審核指南征求意見(jiàn)稿
- XX鎮(zhèn)衛(wèi)生院綜治信訪維穩(wěn)工作方案
- 2023年河南單招語(yǔ)文模擬試題
- GB/T 24894-2025動(dòng)植物油脂甘三酯分子2-位脂肪酸組分的測(cè)定
- 2025-2030中國(guó)北京市寫字樓租售行業(yè)市場(chǎng)發(fā)展現(xiàn)狀及發(fā)展前景預(yù)測(cè)報(bào)告
- 2024南寧青秀區(qū)中小學(xué)教師招聘考試試題及答案
- 乙型肝炎病人的健康教育
- 《道路運(yùn)輸企業(yè)和城市客運(yùn)企業(yè)安全生產(chǎn)重大事故隱患判定標(biāo)準(zhǔn)(試行)》知識(shí)培訓(xùn)
評(píng)論
0/150
提交評(píng)論