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); //錯誤