C/C++中的 void 和 void*


轉自:https://blog.csdn.net/tonglin12138/article/details/86516789

寫在前面:
開門見山,大家看下面這個例子:

unsigned char err;

unsigned char f;

unsigned char a(unsigned char i, void *j){

if(j==(void*)0) return 0;

*(unsigned char*)j=1;

return 1;


void * 就是無類型指針類型,j僅僅是一個指針,他所指向的內存空間沒有被認為是某一種特定的類型。

j 被定義成void *,(void *)0 把0強制轉換為 void *,便於跟j進行同類型比較, 所以 j==(void *)0的意思是,判斷j是不是0,即j是否指向0地址

*(unsigned char *) j,首先看(unsigned char *) j,意思是把j強制類型轉換為unsigned char 型,那么(unsigned char )j就是把 j 指向的內存空間的一個字節強制當作unsigned char來用。(unsigned char *) j =1就是把1寫入j指向的那個一字節空間。

C/C++中的void和void*
一、void

void關鍵字表示“空類型”的概念。但是,這里的“空類型”不表示“任意類型”,而是表示不存在的意思,也就是說C/C++不允許你寫語句void a,不存在類型為void的東西.

void表示“不存在”的意思,可以從void的兩個應用中加以體現:
1、void作為函數的返回值類型時,表示函數返回值不存在,即函數沒有返回值。
例如:

void FunctionNoReturn_0(std::string strName)
{
std::cout << strName << std::endl;
return;
}
void FunctionNoReturn_1(std::string strName)
{
std::cout << strName << std::endl;
}
FunctionNoReturn_1函數體中雖然沒有顯式的Return;語句。但是,有隱式的Return;表示函數不存在返回值。
FunctionNoReturnType(void)
{
return 10;
}
 
在C語言中,凡是不加返回值類型限定的函數,就會被編譯器作為返回整型值處理,而不是沒有返回值。所以,FunctionNoReturnType函數返回10是正確的。
在C++中,每個函數必須限定返回值類型,不允許不加返回值限定。所以,C++編譯器會對FunctionNoReturnType報錯。

2、void作為函數的參數的限定時,表示函數形參不存在,即函數沒有形參。
例如:

void FunctionNoArgument_0(void)
{
return;
}
void FunctionNoArgument_1()
{
return;
}
 
注意:void FunctionNoArgument_1();這也表示沒有形參。
在C語言中,FunctionNoArgument_1(10);是合法的。編譯器不會報錯。
在C語言中,FunctionNoArgument_0(10);是不合法的。編譯器會報錯。
在C++語言中,FunctionNoArgument_1(10);和FunctionNoArgument_0(10);
都是不合法的。編譯器會報錯。
C語言中不報錯,也沒什么關系的。因為,參數10對於函數的執行的結果沒有影響。但是,對於代碼的維護可能會造成隱藏的危害,可能會給別人造成誤解。

說明:既然提供了void的這兩種用法,就去運用。即函數沒返回值就將其返回值類型寫為void,函數沒有形參就將其形參寫為void。不了解編譯器默認操作時,不要依賴。即使了解其默認操作,也別依賴,因為肯定有人不了解的,這樣別人就看不懂你的代碼了。

二、void*

void表示“空類型指針”,與void不同,void表示“任意類型的指針”或表示“該指針與一地址值相關,但是不清楚在此地址上的對象的類型”。(為什么不用void表示任意類型的數據呢?大家都知道,C/C++是靜態類型的語言,定義變量就會分配內存,然而,不同類型的變量所占內存不同,如果定義一個任意類型的變量,如何為其分配內存呢?所以,C、C++中沒有任意類型的變量。但是,所有指針類型的變量,無論是int*、char*、string*、Student*等等,他們的內存空間都是相同的,所以可以定義“任意類型的指針”)。

C++/ANSI C:
void指針只支持幾種有限的操作:與另一個指針進行比較;向函數傳遞void指針或從函數返回void指針;給另一個void指針賦值。不允許使用void指針操作它所指向的對象,例如,不允許對void指針進行解引用。不允許對void指針進行算術操作。
GNU C:
GNU C指定void指針的算術操作與char一致。

void*表示“任意類型的指針”,主要運用於內存操作函數的形參類型和返回值類型(內存操作與內存中數據類型無關,即任意類型都可以)。

memcpy  
原型:extern void *memcpy(void *dest, void *src, unsigned int count);   
用法:#include   
功能:由src所指內存區域復制count個字節到dest所指內存區域。   
說明:src和dest所指內存區域不能重疊,函數返回指向dest的指針。   
注意:與strcpy相比,memcpy並不是遇到’\0’就結束,而是一定會拷貝完n個字節。

memset
原型:extern void *memset(void *buffer, int c, int count);
用法:#include
功能:把buffer所指內存區域的前count個字節設置成字符c。
說明:返回指向buffer的指針。

C/C++的void*差別
C語言中任何類型的指針都可以(隱式地)轉換為void*型,反過來也行;

C++中void型不能隱式地轉換為別的類型指針(例如:intp = (void*)0;使用C++編譯器編譯會報錯)

文章參考來源:https://blog.csdn.net/u012611644/article/details/79561022
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM