詳解 void在c語言中什么意思


詳解 void在c語言中什么意思

在程序中,每一個變量都應該有相應的數據類型,數據的類型決定了編譯器可以為之開辟多少的空間來存放數據 。
例如:int 類型需要 4 個字節,char 類型需要 1 個字節 , 指針類型需要 4 個字節等等 。
但 C 語言中還有一種特殊的數據類型——void 。

1. void 介紹

void 表示為“無”、“空”、“沒有”的意思 。
在這里就把 void 理解為啥也不是 。
作為一個數據類型,如果用 void 聲明變量會是什么情況呢?
詳解 void在c語言中什么意思

編譯器要給數據分配多少的內存空間 , 是要依據變量定義時的數據類型 。
而 void 類型比較特殊 。雖然也是一種數據類型 , 但不確定性太強了 。
如果可以用 void 聲明變量,你要是開心先給個 int 整型的數據,不開心再給個 char 字符型的數據,或者 double 類型的數據 。
這要求的內存空間一會兒大,一會兒小的 , 編譯器也很難辦 。
內存就那么點,經不起這么折騰 。
因此,void 數據類型是不能直接用在變量聲明的 。
那么 void 應該被用在哪里呢?

2. 函數的參數

void 最常使用就是用在函數里面,第一個就是函數的參數 。
通常會看到如下的函數原型定義:
int func(void);int func();這兩個函數表示的意義是一樣的 , 都是無參數、返回值為 int 類型的函數 。
【詳解 void在c語言中什么意思】但有一點不同 。根據不同的編譯器,對語法檢驗嚴格程度也有所不同 。用 g++ 編譯就有可能出現以下的情況:
int func1(void){return 1;}int func2(){return 2;}int main(){func1();func2();func1(123); // errorfunc2(123);func1(3.14); // errorfunc2(3.14);return 0;}參數部分為 void 的函數,在調用函數的時候,有傳入實際參數的時候會產生報錯,傳入的參數太多了!實際上參數為 void 的函數是不能傳入任何類型的參數 。
而參數部分啥都沒有的函數,調用函數的時候可以傳入任意類型是不會報錯的 。
不過這個問題大體上沒有人會這么做 , 因為毫無意義 。

3. 函數的返回類型

void 的另一個作用,就是在函數的返回類型上面 。
有時候,我們只需要函數運行的過程 , 而不是為了獲取最后的結果 。此時就可以使用 void 類型,表示該函數沒有返回值 。
例如:我只想交換 a 和 b 兩個變量分別存儲的數據 。
#include<stdio.h>void swap(int *a, int *b){int temp;temp=*a, *a=*b, *b=temp;}int main(){int a=3, b=5;swap(&a, &b);printf("a=%d, b=%d\n", a, b);return 0;}運行結果:a=5,b=3
一般在 void 定義的函數里面,return 是多余的 。不過,即便加上 return 返回值(gcc 6.3版本中),也對函數沒有什么影響 。
既無法重新使用其他數據類型定義的變量來接收函數的返回值,也不能在 printf 函數中使用的 。
詳解 void在c語言中什么意思


詳解 void在c語言中什么意思


4. void *指針

void * 指針表示為無類型指針 , 作為一個指針類型,編譯器已經為其妥善安排了 4 個字節的小房間 。
因此,void * 指針類型可以用來定義變量 。
void *p;p = NULL;void * 指針雖名為無類型指針,但可以指向任何一種類型的數據,即其他類型指針的指可以不通過強制轉換直接賦給 void * 指針 。
void *p;int *a;p = a;float *f;p = f;在 C 語言當中,對指針類型的轉換要求不是那么嚴苛,可以不通過強制轉換就可以進行相互間的賦值 。
int *a = NULL;float *b = NULL;char *c = NULL;a = b;b = c;c = a;雖然編譯器(gcc 6.3版本)不會顯示有錯誤,編譯照常會通過 。只是會給出類似下面的警告:
警告 C4133 “=”: 從“float *”到“int *”的類型不兼容
而在 C++ 當中,這一點要求就明顯比較嚴格了 。它不允許兩個不同的類型指針相互賦值,除了 void * 指針 。
其他的類型指針可以把值直接賦給 void * 指針,但反過來,void * 指針的值想要賦值給其他類型的指針 , 也需要通過強制轉換 。
void *p = NULL;int *a = (int *)p; // 通過float *b = p; // 報錯void * 指針還有一個非常強大之處,在函數定義的時候 , 作為參數 。當調用的時候,無論什么類型的類型指針或數組都可以正常運行 。
#include<stdio.h>int test(void * dst){...}int main(){char *c = "123456";int arr[] = {1, 2, 3, 4, 5, 6};test(c);// 正常編譯test(arr);// 正常編譯return 0;}不過 void * 指針也有一個致命的缺點,當對該指針進行算數操作,就會顯示以下這個錯誤 。
詳解 void在c語言中什么意思

根據 ANSI C 標準規定 , 進行算數操作的指針,必須明確知道該指針所指向的數據類型大小 。也就是所指向的數據 , 都必須是具體的類型,而不是空泛的 void 類型 。

最后

關于 C 語言 void 數據類型的內容就到此結束了 。


相關經驗推薦