void和void*指針的一些理解

void 和 void* 指針分別表示無類型和無類型指針。算法

void 的做用是限制:函數

  1,函數無返回值。spa

  2,函數無參數。指針

  當函數的返還值無參數的時候必定要加上 void ,由於在缺省的狀態下函數的返還值是 int ,而且若是不須要的時候就必定要將他聲明成 void 類型這樣看着更明顯。當函數無參數的時候在聲明的時候也要加上 void 的這也是一個好習慣,加強了可讀性,固然在 K&R C 中是容許在聲明的時候省去參數的。
code

void 類型的和指針能夠接受任何類型的類型的指針的賦值(可是不表明這個void類型的指針轉化成相應的指針了,若是須要按照原指針的類型使用用,仍是須要進行強制類型轉換)。對象

#include<stdio.h>
int main()
{
    int a=1;
    int *b;
    b=&a;
    void *c;
    c=b;
    printf("%d\n",*(int *)c);
}

 

在void指針存儲的是結構指針須要注意的是看以下代碼片斷:blog

 

if( (*(STRUCTNAME *)p).next == NULL )
    {
        return FALSE;
    }
    else
    {
        free=(*(STRUCTNAME *)p).next;
        (*(STRUCTNAME *)p).next= ( *(STRUCTNAME *)( (*(STRUCTNAME *)p).next ) ).next;
    }

 

 

 

void *的做用編譯器

   你能夠把 void * 指針看做是水果,水果有不少種類,能夠是蘋果,香蕉,可是不能說水果香蕉,由於還多是蘋果,可是你能夠說香蕉是水果。一樣的其餘類型的指針能夠直接賦值給 void * 指針,可是void* 指針就不能夠直接賦值給其餘類型指針,這裏就須要進行類型強制轉換,類型強制轉換能夠躲避過編譯器錯誤的檢測。因此在使用強制類型轉化的時候須要肯定這個轉換是正確的。
io

  void * 指針是一種未知類型的指針,它在使用的時候不受限制,他能夠用來存儲任何類型的指針,這樣獲得的類型就能夠按照你的須要進行轉換。
編譯

  由於 void * 指針其實能夠說是沒有類型,就是編譯器不知道指針所指向對象的長度。

  void * 指針不能進行副引用,就是不能取得 void *指針的內容。

  void * 指針在 ASNI 標準上不許許進行算法操做(如:void *a; int *b; a=b; *a=2; //錯誤) ASNI C 堅信進行算法操做必定要知道指向數據類型的大小,可是在 GNU 中就是能夠的。 GNU 支持了更多的語法,可是爲了可移植性,在編寫代碼的時候仍是要按照 ASNI C 的標準。

相關文章
相關標籤/搜索