1. 程式人生 > >void 和void*的詳解

void 和void*的詳解

void和void*的詳解:

void指該資料無型別,void*指該指標無型別,可以指向任意型別

 1. 如果函式沒有返回值,那麼應宣告為void型別;
 2. 如果函式無引數,那麼應宣告其引數為void;
 3. 如果函式的引數可以是任意型別指標,那麼應宣告其引數為void * ;
  4. void不能代表一個真實的變數;                                                                                                                                                                                 5.void 的主要作用是對函式的引數和返回的限定;

例:     float *p1;                                                                                                                                                                                                      int *p2;                                                                                                                                                                                                                       p1=p2;    //此處將會報錯,需要用強制型別轉換。                                                                                                                                                         換為void 就可以直接進行轉換了。                           void *p1;                                                    int *p2;                                                                                                                                                                                                                       p1=p2;

              但是把 p1給p2就會出錯了;                            void *p1;                                                                                                   int *p2;                                                                   p2=p1;  //可以這樣理解,所有的男人和女人都是人,但是你可以說所有的人都是男人嗎?

下面給出void關鍵字的使用規則:


  規則一 如果函式沒有返回值,那麼應宣告為void型別

  在C語言中,凡不加返回值型別限定的函式,就會被編譯器作為返回整型值處理。但是許多程式設計師卻誤以為其為void型別 。例如:
add ( int a, int b )
{
return a + b;
}

int main(int argc, char* argv[])
{
printf ( "2 + 3 = %d", add ( 2, 3) );
}

程式執行的結果為輸出:
  2 + 3 = 5
  這說明不加返回值說明的函式的確為int函式
 。

規則四如果函式的引數可以是任意型別指標,那麼應宣告其引數為void *

  典型的如記憶體操作函式memcpy和memset的函式原型分別為:
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );

  這樣,任何型別的指標都可以傳入memcpy和memset中,這也真實地體現了記憶體操作函式的意義,因為它操作的物件僅僅是一片記憶體,而不