void指針是什么?
void指針一般被稱為通用指針或泛指針洲拇,它是C關(guān)于“純粹地址(raw address)”的一種約定碧聪。void指針指向某個(gè)對象汤善,但該對象不屬于任何類型绘雁。請看下例:
int *ip;
void *p;
在上例中洞难,ip指向一個(gè)整型值舆吮,而p指向的對象不屬于任何類型。
在C中队贱,任何時(shí)候你都可以用其它類型的指針來代替void指針(在C++中同樣可以)色冀,或者用void指針來代替其它類型的指針(在C++中需要進(jìn)行強(qiáng)制轉(zhuǎn)換),并且不需要進(jìn)行強(qiáng)制轉(zhuǎn)換柱嫌。例如锋恬,你可以把char *類型的指針傳遞給需要void指針的函數(shù)。
什么時(shí)候使用void指針?
當(dāng)進(jìn)行純粹的內(nèi)存操作時(shí)编丘,或者傳遞一個(gè)指向未定類型的指針時(shí)与学,可以使用void指針。void指針也常常用作函數(shù)指針嘉抓。
有些C代碼只進(jìn)行純粹的內(nèi)存操作索守。在較早版本的C中,這一點(diǎn)是通過字符指針(char *)實(shí)現(xiàn)的抑片,但是這容易產(chǎn)生混淆卵佛,因?yàn)槿藗儾蝗菀着袛嘁粋€(gè)字符指針究竟是指向一個(gè)字符串,還是指向一個(gè)字符數(shù)組,或者僅僅是指向內(nèi)存中的某個(gè)地址截汪。
例如疾牲,strcpy()函數(shù)將一個(gè)字符串拷貝到另一個(gè)字符串中,strncpy()函數(shù)將一個(gè)字符串中的部分內(nèi)容拷貝到另一個(gè)字符串中:
char *strepy(char'strl衙解,const char *str2)阳柔;
char *strncpy(char *strl,const char *str2蚓峦,size_t n)盔沫;
memcpy()函數(shù)將內(nèi)存中的數(shù)據(jù)從一個(gè)位置拷貝到另一個(gè)位置:
void *memcpy(void *addrl,void *addr2枫匾,size_t n)架诞;
memcpy()函數(shù)使用了void指針,以說明該函數(shù)只進(jìn)行純粹的內(nèi)存拷貝干茉,包括NULL字符(零字節(jié))在內(nèi)的任何內(nèi)容都將被拷貝谴忧。請看下例:
#include "thingie.h" /* defines struct thingie */
struct thingie *p_src,*p_dest角虫;
/* ... */
memcpy(p_dest沾谓,p_src,sizeof(struct thingie) * numThingies)戳鹅;
在上例中均驶,memcpy()函數(shù)要拷貝的是存放在structthingie結(jié)構(gòu)體中的某種對象op_dest和p_src都是指向structthingie結(jié)構(gòu)體的指針,memcpy()函數(shù)將把從p_src指向的位置開始的sizeof(stuctthingie) *numThingies個(gè)字節(jié)的內(nèi)容拷貝到從p_dest指向的位置開始的一塊內(nèi)存區(qū)域中枫虏。對memcpy()函數(shù)來說妇穴,p_dest和p_src都僅僅是指向內(nèi)存中的某個(gè)地址的指針。