詳解C語(yǔ)言的void*空指針
在C語(yǔ)言中,void稱為無(wú)類型,相應(yīng)的void*稱為無(wú)類型指針或者空指針類型。
void的應(yīng)用
對(duì)函數(shù)返回值的限定。
例如void func(int);該函數(shù)沒(méi)有返回值。對(duì)函數(shù)參數(shù)類型的限定。
例如int func(void);該函數(shù)沒(méi)有參數(shù),不允許接收參數(shù)。
空指針類型(void*)
空指針類型的變量void* pvoid;可以指向任意類型的數(shù)據(jù),任何類型的指針也可以直接賦值給空指針類型的變量。
#include <stdio.h>
int main()
{
char c, *pc;
int i, *pi;
double d, *pd;
void *pvoid;
pc = &c;
pvoid = pc;
printf("pvoid = %p &c = %p\n", pvoid, &c);
pi = &i;
pvoid = pi;
printf("pvoid = %p &i = %p\n", pvoid, &i);
pd = &d;
pvoid = pd;
printf("pvoid = %p &d = %p\n", pvoid, &d);
}
/*
輸出結(jié)果
pvoid = 000000000061FDFF &c = 000000000061FDFF
pvoid = 000000000061FDF8 &i = 000000000061FDF8
pvoid = 000000000061FDF0 &d = 000000000061FDF0
*/
但是如果空指針類型的變量賦值給任意指針類型的變量,就需要強(qiáng)制轉(zhuǎn)換;也就是顯式說(shuō)明該指針指向的內(nèi)存中是存放的什么類型的數(shù)據(jù)。
void *pvoid; int *pi; char *pc; double *pd; pi = (int*)pvoid; pc = (char*)pvoid; pd = (double*)pd;
另外,以下有些需要注意的地方。
在 ANSI C 標(biāo)準(zhǔn)中,不允許對(duì) void 指針進(jìn)行一些算術(shù)運(yùn)算如 p++ 或 p+=1 等。因?yàn)榧热?void 是無(wú)類型,那么每次算術(shù)運(yùn)算我們就不知道該操作幾個(gè)字節(jié),例如 char 型操作 sizeof(char) 字節(jié),而 int 則要操作 sizeof(int) 字節(jié)。而在 GNU 中則允許,因?yàn)樵谀J(rèn)情況下,GNU 認(rèn)為 void * 和 char * 一樣,既然是確定的,當(dāng)然可以進(jìn)行一些算術(shù)操作,在這里sizeof(*p)==sizeof(char)。
int i;
void *pvoid;
pvoid = &i;
printf("%p\n", pvoid);
pvoid++;//ANSI:錯(cuò)誤;GNU:正確
pvoid += 1;//ANSI:錯(cuò)誤;GNU:正確
printf("%p\n", pvoid);
在實(shí)際的程序設(shè)計(jì)中,為迎合 ANSI 標(biāo)準(zhǔn),并提高程序的可移植性,我們可以這樣編寫(xiě)實(shí)現(xiàn)同樣功能的代碼:
((int*)pvoid)++; (int*)pvoid += 1;
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
利用C語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲
這篇文章主要為大家詳細(xì)介紹了利用C語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
詳解C++中如何將構(gòu)造函數(shù)或析構(gòu)函數(shù)的訪問(wèn)權(quán)限定為private
這篇文章主要介紹了詳解C++中如何將構(gòu)造函數(shù)或析構(gòu)函數(shù)的訪問(wèn)權(quán)限定為private的方法,文中還解釋了構(gòu)造函數(shù)與虛函數(shù)的區(qū)別,需要的朋友可以參考下2016-03-03
C語(yǔ)言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)希爾排序算法
這篇文章主要為大家介紹了C語(yǔ)言希爾排序算法實(shí)現(xiàn)植物大戰(zhàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
C++基于easyx圖形庫(kù)實(shí)現(xiàn)推箱子游戲
這篇文章主要為大家詳細(xì)介紹了C++基于easyx圖形庫(kù)實(shí)現(xiàn)推箱子游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
C++實(shí)現(xiàn)基于不相交集合的O(mlgn)復(fù)雜度的kruskal算法
這篇文章主要為大家詳細(xì)介紹了C++如何實(shí)現(xiàn)基于不相交集合的O(mlgn)復(fù)雜度的kruskal算法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-02-02
C++實(shí)現(xiàn)日期計(jì)算器詳細(xì)代碼示例
這篇文章主要給大家介紹了關(guān)于C++實(shí)現(xiàn)日期計(jì)算器的相關(guān)資料,基于C++編寫(xiě)的簡(jiǎn)單的日期計(jì)算器,供大家參考,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03
引用參數(shù)和傳值參數(shù)的區(qū)別深入解析
以下是對(duì)引用參數(shù)和傳值參數(shù)的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-07-07

