C語言 void和void 的區別

2021-09-26 15:09:21 字數 2231 閱讀 5482

在c語言中void 常用於2個方面:對函式返回型別的限定和對函式引數限定。  

(1)對函式返回型別的限定:當函式不需要返回型別是必須用void 來限定返回型別,限定了函式的返回型別為void後,函式不能有返回值。

如:void fun(int a);

(2)對函式引數型別的限定:當函式不允許接受引數時,必須用void 來限定函式引數,限定了函式的引數型別為void後函式不能有引數。

如:int fun(void);

首先介紹下c語言中的「指標」的屬性。

指標有兩個屬性:

(1)指向變數/物件的位址;

(2)所指向變數/物件的長度 。

但是指標變數只儲存其所指向變數/物件的位址。

變數/物件的長度則取決於定義指標變數時所指定的資料型別 。

編譯器根據指標變數的型別從指標指向的位址向後定址。

指標型別不同則定址範圍也不同。

比如:int *從指定位址向後尋找4位元組作為變數的儲存單元 ;

double *從指定位址向後尋找8位元組作為變數的儲存單元 。

void *是一種特別的指標。c語言中void * 為 「不確定型別指標」。

說它特別是因為它沒有型別或者說這個型別不能判斷出指向物件的長度。

在c語言中,經過測試發現:

void *指標賦值給其他型別的指標時不需進行強制型別轉換。

但是在c++中,發現void *指標賦值給其他型別的指標時必須進行強制型別轉換,否則編譯器會報錯。

void

*vp;

type *p=

(type *

)vp;

//轉換型別也就是獲得指向變數/物件大小.這裡type指某種基本資料型別

注:c語言中有些庫函式的返回值型別就是void *指標。比如關於堆的庫函式:

//申請記憶體空間的函式:

void

*malloc

(size_t size)

;void

*calloc

(size_t nmemb, size_t size)

;void

*realloc

(void

*ptr, size_t size)

;//釋放記憶體空間的函式:

void

free

(void

*ptr)

;

下面用同一段**分別儲存為.c和.cpp格式進行編譯執行:

例1:.c檔案:

#include

#include

intmain

(void);

int* p =

malloc

(sizeof

(a))

;//不需進行強制型別轉換

p = a;

printf

("%d\n"

,*p)

;return0;

}

執行結果:

例2:.cpp檔案:

#include

#include

intmain

(void);

int* p =

malloc

(sizeof

(a))

; p = a;

printf

("%d\n"

,*p)

;return0;

}

#include

#include

intmain

(void);

int* p =

(int*)

malloc

(sizeof

(a))

; p = a;

printf

("%d\n"

,*p)

;return0;

}

任何指標都可以賦值給void *指標。

void

*vp;

type *p;

vp=p;

//不需轉換 。只獲得變數/物件位址而不獲得大小

參考:

C語言 當void遇到 void

void 表示無 任意型別指標,大小為8b,任何型別指標均為8b 舉個例子 char a calloc 8,5 分配5個連續8位元組記憶體空間 int b calloc 8,5 分配5個連續8位元組記憶體空間 結果使用char型別接收,每個char占用乙個位元組,因為分配的空間總共有40位元組,所以...

C語言中的void 和void 指標型別

c語言中的void 和void 指標型別 c語言,void,void指標 許多初學者對c中的void 和void 的指標型別不是很了解。因此常常在使用上出現一些錯誤,本文將告訴大家關於void 和void 指標型別的使用方法及技巧。首先,我們來說說void 的含義,void的字面意思是 無型別 vo...

C語言中的void 和void 指標型別

許多初學者對c中的void 和void 的指標型別不是很了解。因此常常在使用上出現一些錯誤,本文將告訴大家關於void 和void 指標型別的使用方法及技巧。首先,我們來說說void 的含義,void的字面意思是 無型別 void 則為 無型別指標 void 可以指向任何型別的 資料。void幾乎只...