2011-12-16 12 views
57

可能性の重複:C++でvoidポインタとは何ですか?

void * foo(int bar);

これはどういう意味:私は、多くの場合、以下のようなものに似ているコードを参照してください
What is a void pointer and what is a null pointer?

何かを返すことができますか?これはC#のdynamicまたはobjectに似ていますか?

+0

類似の質問へのリンク:http://stackoverflow.com/questions/4334831/what-is-a-void-pointer-and-what-is-a-null-pointer – ksming

+0

「ダイナミック」とは関係がありませんオブジェクトとの「全体的な類似性」に過ぎない。 –

答えて

69

void*は何も意味しません。これはポインタですが、ポインタが指している型はわかりません。

「何か」を返すことはできません。 void*を返す関数は、一般的に次のいずれかを実行しています。

  • フォーマットされていないメモリを扱っています。これは、operator newmallocが返すもので、特定のサイズのメモリブロックへのポインタです。メモリは型を持たないので(まだ正しく構成されたオブジェクトがないため)、型がありません。 IE:void
  • これは不透明なハンドルです。特定のタイプに名前を付けることなく、作成されたオブジェクトを参照します。構造体/クラスを宣言して単純にパブリックな定義を提供しない方が良いので、これを行うコードは一般的には形式が整っていません。それ以来、少なくともそれは本当のタイプを持っています。
  • これは、ポインタを使用できるタイプを明示する明示的な文書を持っています。

これは、C#でdynamicまたはobjectなどの何もではありません。これらの構文は実際に元の型が何であるかを知っています。 void*ではありません。これは、それを間違ってしまうのは非常に簡単なので、それらのいずれよりもはるかに危険です。

個人的には、void*の「頻繁」を使用するコードがある場合は、あなたが見ているコードを再考する必要があります。 void*の使用法、、特に(C++)はまれであり、未処理メモリを処理するために使用されます。

+0

ありがとう+1のvoid *をC#/ Javaの 'Object' – KGCybeX

4

void *は何かを指すことができます(タイプ情報のない生のポインタです)。

+7

ポインタは何でも指すことができます。 –

22

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

+0

Cでは、 'void *'が実際のポインタ型に自動的に昇格するので、Cの 'malloc'はすぐに別のものにキャストすることを実際には期待しません:http://stackoverflow.com/q/605845/ 837703。 C++は別の話ですが、とにかくC++で 'new'を使うはずです。 –

+1

@ArkaMajumdar暗黙のキャストはまだキャストされています。ポインターのタイプが変わります。これが有用です。 –

20

キーワードはVoidです。 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* pointer_variable; 

void *pVoid; // pVoid is a void pointer 

のvoidポインタはポインタの型としてボイドキーワードを使用して、通常のポインタのように宣言されています

しかし、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 
+4

C++では、最後の3行は、C のように明示的に 'void *'にキャストする必要があるため、コンパイルエラーが発生します。 –

+0

@ User1988あなたの投稿を編集する方法を学んでください。 –

+0

コード例は現在動作してありがとうございます。私にとって、この質問とトップ2の回答は、リンクされた「重複」よりも簡潔で指摘されています。 – Garrick

関連する問題