1. ホーム
  2. c++

[解決済み] C++のvoidポインタとは何ですか?重複

2022-12-25 16:50:02

質問

重複の可能性があります。

voidポインタとnullポインタとは何ですか?

以下のようなコードをよく見かけます。

void * foo(int bar);

これはどういう意味なのでしょうか?を返すことができるということでしょうか? 何でも ? これは dynamic または object をC#で使うか?

どのように解決するには?

A void* は何も意味しない。これはポインタですが、それが指す型は不明です。

"anything"を返すことができるというわけではありません。を返す関数は void* を返す関数は、一般に次のいずれかを行っています。

  • フォーマットされていないメモリーを扱っている。これは operator newmalloc return: 一定の大きさのメモリブロックへのポインタ。このメモリは型を持たないので(まだ適切に構築されたオブジェクトが入ってないので)、型なしです。IEで void .
  • これは不透明なハンドルです。特定の型を指定することなく、作成されたオブジェクトを参照します。これは、構造体/クラスを前方に宣言し、単にそれに対するパブリック定義を提供しないことによってよりよく行われるため、これを行うコードは一般的に不完全な形式である。なぜなら、その場合、少なくともそれは実際の型を持っているからです。
  • これは、既知の型のオブジェクトを含むストレージへのポインタを返します。しかし、その API は多種多様な型のオブジェクトを扱うために使用されるため、特定の呼び出しが返す正確な型はコンパイル時に知ることができない。したがって、いつどの種類のオブジェクトを格納し、したがってどの型に安全にキャストできるかを説明するドキュメントが存在することになります。

この構成は 何もない のように dynamic または object をC#で使うことができます。これらのツールは実際に元の型が何であるかを知っています。 void* は知りません。 . このため、非常に簡単に間違うことができ、特定の使い方が正しいかどうかを尋ねる方法がないため、これらのどれよりもはるかに危険です。

また、個人的なことですが、もしあなたが void* が使われているコードを見たら、どんなコードを見ているのか考え直すべきでしょう。 void* の使い方を考えてみてください。 特に を使用することは稀で、主に生のメモリを処理するために使用されます。