web-dev-qa-db-ja.com

C ++のvoidポインターとは何ですか?

可能性のある複製:
voidポインターとは何ですか、nullポインターとは何ですか?

次のようなコードがよく見られます。

void * foo(int bar);

これは何を意味するのでしょうか?それは何かを返すことができるということですか?これは、C#のdynamicまたはobjectに似ていますか?

76
zeboidlund

void*は何の意味もありません。これはポインターですが、それが指すタイプは不明です。

「何でも」を返すことができるわけではありません。 void*を返す関数は通常、次のいずれかを実行しています。

  • 未フォーマットのメモリを扱っています。これは、operator newおよびmallocが返すものです。特定のサイズのメモリブロックへのポインタです。メモリには型がないため(まだ適切に構築されたオブジェクトがないため)、型はありません。 IE:void
  • 不透明なハンドルです。特定のタイプに名前を付けることなく、作成されたオブジェクトを参照します。これを行うコードは、構造/クラスを前方宣言し、パブリック定義を単純に提供しないことでより適切に行われるため、一般に形式が不十分です。そのため、少なくとも実際の型を持っているからです。
  • 既知のタイプのオブジェクトを含むストレージへのポインターを返します。ただし、そのAPIはさまざまなタイプのオブジェクトを処理するために使用されるため、特定の呼び出しが返す正確なタイプをコンパイル時に知ることはできません。したがって、どの種類のオブジェクトを格納するか、したがって、どの型に安全にキャストできるかを説明するドキュメントがいくつかあります。

この構成は、C#のdynamicまたはobjectのようなnothingです。これらのツールは、実際には元のタイプが何であるかを知っています。 void*しない。誤解は非常に簡単であり、特定の使用法が正しいかどうかを尋ねる方法がないため、これはそれらのどれよりもはるかに危険です。

個人的な注意として、void*の「頻繁に」使用するコードが表示された場合、見ているコードを再考する必要があります。 void*の使用法、C++では特にはまれであり、未加工メモリを扱うために主に使用されます。

92
Nicol Bolas

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

28
User1988

void*ポインタは、タイプを指定せずにメモリの塊へのポインタを示す場合に使用されます。 Cのmallocは、そのようなポインターを返します。これは、すぐに特定の型にキャストすることを期待しています。別のポインタ型にキャストするまで、実際には役に立ちません。どの型にキャストするかを知っていることが期待されます。コンパイラには、基礎となる型が何であるかを知るためのリフレクション機能がありません。

23
Mark Ransom

Void *は何でも指すことができます(型情報のない生のポインターです)。

4
axon