void與void *

void關鍵字的使用規則:算法

1. 若是函數沒有返回值,那麼應聲明爲void類型編程

2. 若是函數無參數,那麼應聲明其參數爲void函數

3. 若是函數的參數能夠是任意類型指針,那麼應聲明其參數爲void * spa

4. void不能表明一個真實的變量指針

 

void真正發揮的做用在於:code

  • 對函數返回的限定
  • 對函數參數的限定

規則一: 若是函數沒有返回值,那麼應聲明爲void類型對象

咱們在編寫C/C++程序時,對於任何函數都必須一個不漏地指定其類型。若是函數沒有返回值,必定要聲明爲void類型。這既是程序良好可讀性的須要,也是編程規範性的要求。另外,加上void類型聲明後,也能夠發揮代碼的「自注釋」做用。代碼的「自注釋」即代碼能本身註釋本身。blog

 

規則二:若是函數無參數,那麼應聲明其參數爲void內存

 

規則三:若是函數的參數能夠是任意類型指針,那麼應聲明其參數爲void * 原型

典型的如內存操做函數memcpy和memset的函數原型分別爲:

void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );

這樣,任何類型的指針均可以傳入memcpy和memset中,這也真實地體現了內存操做函數的意義,由於它操做的對象僅僅是一片內存,而不論這片內存是什麼類型。

再如,交換兩個變量:

void swap(void* lsh, void* rhs, size_t size)
{
    ;//
}

有了這樣一個函數,那麼若是想要交換兩個變量,那就能夠:

swap(&ai, &bi, sizeof(int));
swap(&af, &bf, sizeof(float));

 

 

當心使用void *

衆所周知,若是指針p1和p2的類型相同,那麼咱們能夠直接在p1和p2間互相賦值;若是p1和p2指向不一樣的數據類型,則必須使用強制類型

float *p1;
int *p2;
p1 = (float *)p2;

而void *則不一樣,任何類型的指針均可以直接賦值給它,無需進行強制類型轉換:

void *p1;
int *p2;
p1 = p2; 

void*和其餘指針同樣,都是佔一樣大小的內存空間,惟一和其餘指針不一樣的就在於你不能對void*進行解引用,看起來其餘類型的指針均可以用void*來代替,只要在解引用以前把它轉換爲相應類型的指針就OK了!

不能對void指針進行算法操做,即下列操做都是不合法的:

void * pvoid;
pvoid++; //ANSI:錯誤
pvoid += 1; //ANSI:錯誤

ANSI標準之因此這樣認定,是由於它堅持:進行算法操做的指針必須是肯定知道其指向數據類型大小的。

 

規則四:void不能表明一個真實的變量

下面代碼都企圖讓void表明一個真實的變量,所以都是錯誤的代碼:void a; //錯誤function(void a); //錯誤

相關文章
相關標籤/搜索