((void *) 0)的含義和void的一些細節


一、在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      //錯誤,不能把無符號指針賦給有符號指針

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM