C++中void和void*指针的含义 (指针类型的含义)
轉(zhuǎn)載自:http://blog.csdn.net/lee_shuai
指針有兩個(gè)屬性:指向變量/對(duì)象的地址和長(zhǎng)度,但是指針只存儲(chǔ)地址,長(zhǎng)度則取決于指針的類型;編譯器根據(jù)指針的類型從指針指向的地址向后尋址,指針類型不同則尋址范圍也不同,比如:
int*從指定地址向后尋找4字節(jié)作為變量的存儲(chǔ)單元 double*從指定地址向后尋找8字節(jié)作為變量的存儲(chǔ)單元void即“無類型”,void *則為“無類型指針”,可以指向任何數(shù)據(jù)類型。
1 ?void的作用
1)? ?對(duì)函數(shù)返回的限定
a) 當(dāng)函數(shù)不需要返回值時(shí),必須使用void限定。例如: voidfunc(int, int);2)? ?對(duì)函數(shù)參數(shù)的限定
a) 當(dāng)函數(shù)不允許接受參數(shù)時(shí),必須使用void限定。例如: intfunc(void)。2 ?void* 指針意義
2.1???void類型指針可以指向任意類型的數(shù)據(jù),即可用任意數(shù)據(jù)類型的指針對(duì)void指針賦值。
int *pint;
void *pvoid; //它沒有類型,或者說這個(gè)類型不能判斷出指向?qū)ο蟮拈L(zhǎng)度
pvoid = pint; //只獲得變量/對(duì)象地址而不獲得大小,但是不能 pint =pvoid; 2.2???如果要將pvoid賦給其他類型指針,則需要強(qiáng)制類型轉(zhuǎn)換如:
pint = (int *)pvoid; //轉(zhuǎn)換類型也就是獲得指向變量/對(duì)象大小2.3???void指針不能解引用(即取內(nèi)容的意思)
*pvoid //錯(cuò)誤 要想解引用一個(gè)指針,或者使用“->”運(yùn)算符復(fù)引用一部分,都要有對(duì)于指針指向的內(nèi)存的解釋規(guī)則。反過來
例如,int *p;
那么,當(dāng)你后面解引用p的時(shí)候,編譯器就會(huì)把從p指向的首地址開始的四個(gè)字節(jié)看作一個(gè)整數(shù)的補(bǔ)碼。
因?yàn)関oid指針只知道指向變量/對(duì)象的起始地址,而不知道指向變量/對(duì)象的大小(占幾個(gè)字節(jié))所以無法正確引用
?
2.4???如果函數(shù)的參數(shù)可以是任意類型指針,那么應(yīng)聲明其參數(shù)為void*。
典型的如內(nèi)存操作函數(shù)memcpy和memset的函數(shù)原型分別為:
void*memcpy(void* dest,const void* src, size_t len); 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*,那是不具有普遍適用性的
轉(zhuǎn)載于:https://www.cnblogs.com/clemente/p/10905335.html
總結(jié)
以上是生活随笔為你收集整理的C++中void和void*指针的含义 (指针类型的含义)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity整合TortoiseSVN
- 下一篇: 90 % 的 Python 开发者不知道