C語言 void的用法解析

2021-10-06 10:36:35 字數 3077 閱讀 2413

​ void 中文翻譯為"無型別",有的也叫"空型別"。常用在程式中對定義函式的引數型別、返回值、函式中指標型別進行宣告。

首先應該注意一點的是void型別是不同於其他常見型別的,即void 型別不能夠用來申明變數和常量。因為我們申明變數的時候需要明確告訴編譯器,該變數是什麼型別,比如說是int 或 char型別,這樣編譯才好為這個變數去分配儲存空間,但你不能告訴編譯器說我這是乙個"空型別",這樣的話編譯器肯定不會幹的,自然你編譯的時候回報錯:"illegal use of type 'void'"

總的來說,void應用最廣泛的就是跟指標結合,而void和指標的結合也大大擴充套件了指標的可能性。

void

*/*無型別指標,也稱為空指標,可以指向任何型別的資料

*注意一點:當我們需要使用void 型別的的指標變數區指向某一型別的變數的時候,必須要對其進行型別轉換

*/

我們在定義乙個指標變數的時候第一件事就是指定我們指標變數所指向的變數的型別。一旦被指定,我們的指標變數就只能指向這一型別的變數,即只能儲存這一類變數的位址。之所以這樣呢,是跟我們計算機的儲存資料的形式有關。簡單來講,就是不同型別的變數被分配的記憶體大小是不一樣的。

第一點,我們先看乙個例子,這裡有乙個典型的應用案例就是malloc函式,即我們經常會使用到的記憶體申請函式。請看乙個小例子:

int

*p_int;

p_int =

(int*)

malloc

(sizeof

(int))

;

先要說明一點的是,malloc()分配了記憶體,但沒有為它指定名字,但是它卻可以返回那塊記憶體第乙個位元組的位址。因此,可以把那個位址賦值給乙個指標變數,並使用該指標來訪問那塊記憶體。因為char代表乙個位元組,所以傳統用法上曾將malloc()定義為指向char的指標型別。然而,ansic標準使用了乙個新型別:指向void的指標。這一型別被用作「通用指標」。

因為malloc分配記憶體返回的是乙個void 型別的指標,所以我們在使用的時候通常會對該指標型別進行強制轉換為我們所需要的的指標型別。這樣我們就可以使用malloc()來為我們分配任意大小的記憶體空間(當然了,這個大小應該小於堆區的大小)。

我們知道兩個指標變數p1,p2,只有當它們型別相同的時候才能進行互相賦值。如果p1,p2指向不同的資料型別,那麼他們必須進行型別轉換才能相互賦值。比如:

float

*p1;

int*p2;

p1 = p2;

執行上面一段程式的時候我們會發現會報錯,提示"cannot convert from 『int*』 to 『float*』",若改為

int

*p1;

void

*p2;

p1 = p2;

此時就不會報錯,因為賦值運算子的右邊進行了隱式型別轉換

void另乙個重要的應用則就是跟函式進行結合主要有以下兩個方面的應用。

對函式返回的限定;

對函式引數的限定;

如果函式沒有返回值那麼應宣告為void 型別

c語言中有乙個規則,凡是不加返回值限定的函式,就會被編譯器作為整型值處理。但是許多人卻誤以為其為void型別。

因為c語言不像c++那樣有很嚴格的型別安全檢查。所以為了避免混,對於任何函式必須制定其返回值型別。如果函式沒有返回值一定要宣告為void型別。這樣既可避免混淆也方便自己和別人檢視我們的**。

如果函式無引數,那麼應該宣告其引數為void

如果我們所寫的函式不接受任何引數,那麼一定要指明其引數為void。

如果函式的引數可以是任意型別指標,那麼應宣告其引數為void *

這裡有兩個很經典的記憶體處理函式,在驅動中應用很廣泛。

void

*memcpy

(void

*dest,

const

void

*src,

size_t len)

;void

memset

(void

*buffer,

int c ,

size_t num)

;

可以看到我們用void 來修飾了函式引數型別,即我們可以傳任意型別指標。這也體現記憶體操作函式的意義,因為它操作的物件僅僅是一片記憶體,而不論這片記憶體儲存的資料是什麼型別。

使用void型別指標時應該注意

按照c標準規定,我們不能對void型指標進行運算。對有型別的指標進行演算法操作的時候我們知道,因為其有具體所指向的型別,所以其的演算法是其所指向的資料型別為單位進行的。而void為空或者說無型別,所以就無法對其進行演算法運算。

我們如果要對其進行運算的話就必須進行型別轉換,這裡有乙個典型的應用案例就是malloc函式,我們經常會使用到的記憶體申請函式。請看乙個小例子:

先要說明一點的是,malloc()分配了記憶體,但沒有為它指定名字,但是它卻可以返回那塊記憶體第乙個位元組的位址。因此,可以把那個位址賦值給乙個指標變數,並使用該指標來訪問那塊記憶體。因為char代表乙個位元組,所以傳統用法上曾將malloc()定義為指向char的指標型別。然而,ansic標準使用了乙個新型別:指向void的指標。這一型別被用作「通用指標」。

因為malloc分配記憶體返回的是乙個void 型別的指標,所以我們在使用的時候通常會對該指標型別進行強制轉換為我們所需要的的指標型別。

void 不能代表乙個真實的資料型別

這個前面提到過,因為void在c語言中解釋為空,或者無型別,所以它當然無法代表乙個真實的資料型別了。不過我們可以對其進行型別轉換,這樣它又可以變成各種各樣的資料型別,所以我們可以將其理解成乙個"抽象資料型別"

void用法解析

void型別一般是由兩方面的用法 1 放在函式名前面,表示此函式無返回值 若是放置在函式後的小括號內,表示該函式沒有傳入值。如int main void 2 作為指標型別void 表示其為暫時未知的指標型別。如malloc 動態分配空間函式的返回值就為void型別 一般是經過強制型別轉換轉換成需要的...

C語言 void 用法例項

unsigned char err unsigned char f unsigned char a unsigned char i,void j void functionnoreturn 1 std string strname functionnoreturn 1函式體中雖然沒有顯式的retur...

C語言 void和void 的區別

在c語言中void 常用於2個方面 對函式返回型別的限定和對函式引數限定。1 對函式返回型別的限定 當函式不需要返回型別是必須用void 來限定返回型別,限定了函式的返回型別為void後,函式不能有返回值。如 void fun int a 2 對函式引數型別的限定 當函式不允許接受引數時,必須用vo...