1.概述
許多初學(xué)者對(duì)C/C++語(yǔ)言中的void及void指針類型不甚理解,因此在使用上出現(xiàn)了一些錯(cuò)誤。本文將對(duì)void關(guān)鍵字的深刻含義進(jìn)行解說(shuō),并詳述void及void指針類型的使用方法與技巧。
2.void的含義
void的字面意思是“無(wú)類型”,void *則為“無(wú)類型指針”,void *可以指向任何類型的數(shù)據(jù)。
void幾乎只有“注釋”和限制程序的作用,因?yàn)閺膩?lái)沒(méi)有人會(huì)定義一個(gè)void變量,讓我們?cè)囍鴣?lái)定義:
void a;
這行語(yǔ)句編譯時(shí)會(huì)出錯(cuò),提示“illegal use of type 'void'”。不過(guò),即使void a的編譯不會(huì)出錯(cuò),它也沒(méi)有任何實(shí)際意義。
void真正發(fā)揮的作用在于:
(1) 對(duì)函數(shù)返回的限定;
(2) 對(duì)函數(shù)參數(shù)的限定。
我們將在第三節(jié)對(duì)以上二點(diǎn)進(jìn)行具體說(shuō)明。
眾所周知,如果指針p1和p2的類型相同,那么我們可以直接在p1和p2間互相賦值;如果p1和p2指向不同的數(shù)據(jù)類型,則必須使用強(qiáng)制類型轉(zhuǎn)換運(yùn)算符把賦值運(yùn)算符右邊的指針類型轉(zhuǎn)換為左邊指針的類型。
例如:
float *p1;
int *p2;
p1 = p2;
其中p1 = p2語(yǔ)句會(huì)編譯出錯(cuò),提示“'=' : cannot convert from 'int *' to 'float *'”,必須改為:
p1 = (float *)p2;
而void *則不同,任何類型的指針都可以直接賦值給它,無(wú)需進(jìn)行強(qiáng)制類型轉(zhuǎn)換:
void *p1;
int *p2;
p1 = p2;
但這并不意味著,void *也可以無(wú)需強(qiáng)制類型轉(zhuǎn)換地賦給其它類型的指針。因?yàn)椤盁o(wú)類型”可以包容“有類型”,而“有類型”則不能包容“無(wú)類型”。道理很簡(jiǎn)單,我們可以說(shuō)“男人和女人都是人”,但不能說(shuō)“人是男人”或者“人是女人”。下面的語(yǔ)句編譯出錯(cuò):
void *p1;
int *p2;
p2 = p1;
提示“'=' : cannot convert from 'void *' to 'int *'”。
許多初學(xué)者對(duì)C/C++語(yǔ)言中的void及void指針類型不甚理解,因此在使用上出現(xiàn)了一些錯(cuò)誤。本文將對(duì)void關(guān)鍵字的深刻含義進(jìn)行解說(shuō),并詳述void及void指針類型的使用方法與技巧。
2.void的含義
void的字面意思是“無(wú)類型”,void *則為“無(wú)類型指針”,void *可以指向任何類型的數(shù)據(jù)。
void幾乎只有“注釋”和限制程序的作用,因?yàn)閺膩?lái)沒(méi)有人會(huì)定義一個(gè)void變量,讓我們?cè)囍鴣?lái)定義:
void a;
這行語(yǔ)句編譯時(shí)會(huì)出錯(cuò),提示“illegal use of type 'void'”。不過(guò),即使void a的編譯不會(huì)出錯(cuò),它也沒(méi)有任何實(shí)際意義。
void真正發(fā)揮的作用在于:
(1) 對(duì)函數(shù)返回的限定;
(2) 對(duì)函數(shù)參數(shù)的限定。
我們將在第三節(jié)對(duì)以上二點(diǎn)進(jìn)行具體說(shuō)明。
眾所周知,如果指針p1和p2的類型相同,那么我們可以直接在p1和p2間互相賦值;如果p1和p2指向不同的數(shù)據(jù)類型,則必須使用強(qiáng)制類型轉(zhuǎn)換運(yùn)算符把賦值運(yùn)算符右邊的指針類型轉(zhuǎn)換為左邊指針的類型。
例如:
float *p1;
int *p2;
p1 = p2;
其中p1 = p2語(yǔ)句會(huì)編譯出錯(cuò),提示“'=' : cannot convert from 'int *' to 'float *'”,必須改為:
p1 = (float *)p2;
而void *則不同,任何類型的指針都可以直接賦值給它,無(wú)需進(jìn)行強(qiáng)制類型轉(zhuǎn)換:
void *p1;
int *p2;
p1 = p2;
但這并不意味著,void *也可以無(wú)需強(qiáng)制類型轉(zhuǎn)換地賦給其它類型的指針。因?yàn)椤盁o(wú)類型”可以包容“有類型”,而“有類型”則不能包容“無(wú)類型”。道理很簡(jiǎn)單,我們可以說(shuō)“男人和女人都是人”,但不能說(shuō)“人是男人”或者“人是女人”。下面的語(yǔ)句編譯出錯(cuò):
void *p1;
int *p2;
p2 = p1;
提示“'=' : cannot convert from 'void *' to 'int *'”。