一、在c語言中,0是一個特殊的值,它可以表示:整型數值0,空字符,邏輯假(false)。表示的東西多了,有時候不好判斷。尤其是空字符和數字0之間。
為了明確的指出,0是空字符的含義,用用到了: ((void *) 0) 這個表達式。表示把0強制轉換為空字符,不管以前代表的什么含義。
在c的標准頭文件中,就是這樣定義NULL的:
#define NULL ((void *) 0)
關於void在指針的應用:
void表示“無類型”,void *表示無類型指針。在定義指針的時候,必須聲明指針的類型,因為類型決定了指針移動的字節數。
例題:
double d=3.14; double *dptr=&d; int *iptr=dptr; //錯誤,double和int占用不同的字節,編譯報錯。
double d=3.14; double *dptr=&d; void *vptr=dptr //正確,無類型指針可以接受任何類型的指針。
二、那么這種“無類型的指針”能進行取值操作嗎?可以,但是要注意:
下面的做法是正確的:
#include <stdio.h> int main(int argc, char *argv[]) { double d=3.14; double *dptr=&d; void *vptr=dptr; printf("vptr's value %f.\n",*((double*)vptr)); int i=10; vptr=&i; printf("vptr's value %d.\n",*((int*)vptr)); return 0; }
*((double*)vptr)的含義是:把vptr強制轉換為double類型指針,再用*號取值。
因為:*為單目運算符,優先級由右至左,所以去掉外層括號也是可以的。*((double *)vptr) 等價 *(double *)vptr
三、不能把“無類型指針”賦給“有類型指針”,比如:可以說,“男人女人都是人”,但不能說,“人是男人”或者“人是女人”。看例題:
void *vptr; double *dptr dptr=vptr //錯誤,不能把無符號指針賦給有符號指針