簡體   English   中英

指向無效的指針

[英]pointer to void

這是一種基本的方法,但我似乎無法掌握。 這里參考

void *pconst void *p足夠不同? 為什么函數使用const void *而不是void *

完全使用void* (無論是否為const )的原因是它提供的通用性。 這就像一個基類:所有指針都是 void* ,可以隱式轉換為它,但是從void*到類型化指針的轉換必須顯式且手動進行。

通常,C ++提供了更好的方法來執行此操作(即OO和模板),因此,除非您與C相連,否則根本不要使用void* 。但是,如果使用C,則使用const在其他地方提供它提供的功能:您需要一個(附加) const_cast才能更改所引用的對象,因此不太可能意外更改它。

當然,這不依賴於您不采用C樣式強制轉換,而是顯式C ++強制轉換。 void*到任何T*需要static_cast ,這不允許刪除const 因此,您可以使用static_castconst void* static_castconst char* ,而不能static_castchar* 這將需要一個額外的const_cast

在c ++中,指針前面的const表示不應更改指針地址處的數據。 即它阻止某人這樣做:

int v1 = 3;
int v2 = 4;
const int *pv = &v1;
pv = &v2 // ok;
*pv = 5; // error

您還可以使指針值本身為const:

int v1 = 3;
int v2 = 4;
int * const pv = &v1;
*pv = 5; // ok
pv = &v2; // error

您還可以將兩者結合起來:

int v1 = 3;
int v2 = 4;
const int * const pv = &v1;
*pv = 5; // error
pv = &v2; // error

有一個簡單的區別。 如前所述,由於C ++具有更好的類型系統,模板等,因此在C ++中幾乎不需要使用void* 。但是,當與C或系統調用接口時,有時需要一種方法來指定沒有已知類型的值。

正如您所問的那樣, void*const void*之間的區別是一個提示,向您顯示是否將在所調用的函數內修改指向內存的內容, const意味着它將具有只讀訪問權限。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM