C++ void*用法記錄

void的字面意思是空類型,void *的意思是空類型指針,void 不是一個真正的類型,咱們在聲明變量的時候歷來不會像下面這樣聲明:函數

void a;指針

若是咱們寫了一行這樣的代碼,某些編譯器會直接報錯,有些則不會,但也沒有任何意義。原型

 

void真正的用途在下面兩個方面:編譯器

  1. 對函數返回值的限定編譯

  2. 對函數參數的限定class

     

 

好比,函數沒有返回值,那麼函數可能會聲明成這樣:void fun(int a);變量

若是函數有返回值,可是函數沒有參數,那麼函數的可能會聲明成這樣:int fun(void)。gcc

 

以上的狀況都是很好理解的。下面介紹void *的一些用法。gc

 

1. 函數可接受任意類型的指針。類型轉換

用過memset或者memcpy的細心的人會發現,在gcc中編譯相似下面的代碼都不會有警告:

int a;

int *p = &a;

memset(p, 0, 4);

或者

char c[4];

char *p = c;

memset(p, 0, 4);

爲何memset傳int *仍是char *都沒有問題呢?咱們知道不一樣類型間複製是要進行強制轉換的,那麼這裏爲何不用強制類型轉換呢。咱們看memset的原型會發現,memset的第一個參數就是void *。

 

2. void *類型能夠接受任意類型指針。

例如:

void *p1;

char *p2 = 「hellp」;

p1 = p2;

這是沒有問題的,任何類型的指針均可以直接賦值給它,無需進行強制類型轉換。但須要注意的一點是,void *的類型並不能無需類型轉換直接賦值給其餘類型,好比malloc的返回值是void *,那麼咱們通常這樣寫:char *p = (char *)malloc(4);

 

3. void *類型不能作運算

好比咱們不要作相似這樣的操做:

void *p;

p++;

說白了void並非一個真實的變量,void能夠看做一個抽象概念。

 

以上說法因爲C標準不一樣,可能有部分差別,須要特殊對待,但大致就是這樣的。

相關文章
相關標籤/搜索