void的字面意思是空型別,void *的意思是空型別指標,void 不是乙個真正的型別,我們在宣告變數的時候從來不會像下面這樣宣告:
void a;
如果我們寫了一行這樣的**,某些編譯器會直接報錯,有些則不會,但也沒有任何意義。
void真正的用途在下面兩個方面:
對函式返回值的限定
對函式引數的限定
比如,函式沒有返回值,那麼函式可能會宣告成這樣:void fun(int a);
如果函式有返回值,但是函式沒有引數,那麼函式的可能會宣告成這樣:int fun(void)。
以上的情況都是很好理解的。下面介紹void *的一些用法。
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標準不同,可能有部分差異,需要特殊對待,但大體就是這樣的。
**
void和void 的用法
1 void的作用 c語言中,void為 不確定型別 不可以用void來宣告變數。如 void a 10 如果出現這樣語句編譯器會報錯 variable or field a declared void。在c語言中void 常常用於 對函式返回型別的限定和對函式引數限定 1 對函式返回型別的限定 當...
void和void 的用法總結和注意點
void的字面意思是空型別,void 的意思是空型別指標,void 不是乙個真正的型別,我們在宣告變數的時候從來不會像下面這樣宣告 void a 如果我們寫了一行這樣的 某些編譯器會直接報錯,有些則不會,但也沒有任何意義。void真正的用途在下面兩個方面 對函式返回值的限定 對函式引數的限定 比如,...
void 詳解和用法
用過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 都沒有問題呢?我們知道不同型別間複製是要進行強制...