可能性のある複製:
voidポインターとは何ですか、nullポインターとは何ですか?
次のようなコードがよく見られます。
void * foo(int bar);
これは何を意味するのでしょうか?それは何かを返すことができるということですか?これは、C#のdynamic
またはobject
に似ていますか?
void*
は何の意味もありません。これはポインターですが、それが指すタイプは不明です。
「何でも」を返すことができるわけではありません。 void*
を返す関数は通常、次のいずれかを実行しています。
operator new
およびmalloc
が返すものです。特定のサイズのメモリブロックへのポインタです。メモリには型がないため(まだ適切に構築されたオブジェクトがないため)、型はありません。 IE:void
。この構成は、C#のdynamic
またはobject
のようなnothingです。これらのツールは、実際には元のタイプが何であるかを知っています。 void*
しない。誤解は非常に簡単であり、特定の使用法が正しいかどうかを尋ねる方法がないため、これはそれらのどれよりもはるかに危険です。
個人的な注意として、void*
の「頻繁に」使用するコードが表示された場合、見ているコードを再考する必要があります。 void*
の使用法、C++では特にはまれであり、未加工メモリを扱うために主に使用されます。
Voidはキーワードとして使用されます。 voidポインターは、ジェネリックポインターとも呼ばれ、任意のデータ型のオブジェクトを指すことができる特別なタイプのポインターです! voidポインターは、ポインターのタイプとしてvoidキーワードを使用して、通常のポインターのように宣言されます。
一般的な構文:
void* pointer_variable;
void *pVoid; // pVoid is a void pointer
Voidポインターは、任意のデータ型のオブジェクトを指すことができます。
int nValue;
float fValue;
struct Something
{
int nValue;
float fValue;
};
Something sValue;
void *pVoid;
pVoid = &nValue; // valid
pVoid = &fValue; // valid
pVoid = &sValue; // valid
ただし、voidポインターはどのタイプのオブジェクトを指しているのかわからないため、逆参照できません。むしろ、voidポインターは、間接参照される前に、最初に別のポインター型に明示的にキャストする必要があります。
int nValue = 5;
void *pVoid = &nValue;
// can not dereference pVoid because it is a void pointer
int *pInt = static_cast<int*>(pVoid); // cast from void* to int*
cout << *pInt << endl; // can dereference pInt
ソース: link
void*
ポインタは、タイプを指定せずにメモリの塊へのポインタを示す場合に使用されます。 Cのmalloc
は、そのようなポインターを返します。これは、すぐに特定の型にキャストすることを期待しています。別のポインタ型にキャストするまで、実際には役に立ちません。どの型にキャストするかを知っていることが期待されます。コンパイラには、基礎となる型が何であるかを知るためのリフレクション機能がありません。
Void *は何でも指すことができます(型情報のない生のポインターです)。