詳解C語言的void*空指針
在C語言中,void
稱為無類型,相應的void*
稱為無類型指針或者空指針類型。
void的應用
對函數(shù)返回值的限定。
例如void func(int);
該函數(shù)沒有返回值。對函數(shù)參數(shù)類型的限定。
例如int func(void);
該函數(shù)沒有參數(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); }
/*
輸出結果
pvoid = 000000000061FDFF &c = 000000000061FDFF
pvoid = 000000000061FDF8 &i = 000000000061FDF8
pvoid = 000000000061FDF0 &d = 000000000061FDF0
*/
但是如果空指針類型的變量賦值給任意指針類型的變量,就需要強制轉換;也就是顯式說明該指針指向的內存中是存放的什么類型的數(shù)據(jù)。
void *pvoid; int *pi; char *pc; double *pd; pi = (int*)pvoid; pc = (char*)pvoid; pd = (double*)pd;
另外,以下有些需要注意的地方。
在 ANSI C 標準中,不允許對 void 指針進行一些算術運算如 p++ 或 p+=1 等。因為既然 void 是無類型,那么每次算術運算我們就不知道該操作幾個字節(jié),例如 char 型操作 sizeof(char) 字節(jié),而 int 則要操作 sizeof(int) 字節(jié)。而在 GNU 中則允許,因為在默認情況下,GNU 認為 void * 和 char * 一樣,既然是確定的,當然可以進行一些算術操作,在這里sizeof(*p)==sizeof(char)
。
int i; void *pvoid; pvoid = &i; printf("%p\n", pvoid); pvoid++;//ANSI:錯誤;GNU:正確 pvoid += 1;//ANSI:錯誤;GNU:正確 printf("%p\n", pvoid);
在實際的程序設計中,為迎合 ANSI 標準,并提高程序的可移植性,我們可以這樣編寫實現(xiàn)同樣功能的代碼:
((int*)pvoid)++; (int*)pvoid += 1;
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!
相關文章
C++數(shù)據(jù)結構之文件壓縮(哈夫曼樹)實例詳解
這篇文章主要介紹了C++數(shù)據(jù)結構之文件壓縮(哈夫曼樹)實例詳解的相關資料,利用哈夫曼編碼的方式對文件進行壓縮,并且對壓縮文件可以解壓,需要的朋友可以參考下2017-07-07