私はこれをStack Overflowで検索しようとしましたが、構文が原因で、何を検索すればよいか正確にわからないため、少し動けなくなったと思います。
(void*)
私は、通常は関数呼び出しにキャストするのに慣れているのを見てきました。これは何に使われますか?
私はこれをStack Overflowで検索しようとしましたが、構文が原因で、何を検索すればよいか正確にわからないため、少し動けなくなったと思います。
(void*)
私は、通常は関数呼び出しにキャストするのに慣れているのを見てきました。これは何に使われますか?
void*
通常void ポインターと呼ばれるは、任意の型のオブジェクトを指すことができる汎用ポインター型です。さまざまな型のオブジェクトへのポインターはメモリ内でほとんど同じであるため、void ポインターを使用して型チェックを回避できます。これは、複数のデータ型を処理する関数を作成するときに役立ちます。
void ポインターは、C++ よりも C で役立ちます。通常は void ポインターの使用を避け、代わりに関数のオーバーロードまたはテンプレートを使用する必要があります。型チェックは良いことです!
void ポインターは、型とサイズが不明な値へのポインターです。C でどのように使用されるかの例を示しますが、C++ では概して使用すべきではない (そして実際には必要ない) と言う点で他のコメント作成者は正しいですが。
キーと値を格納する構造体があるとします。次のように定義できます。
typedef struct item_t
{
char *key;
int value;
} item_t;
したがって、この構造を使用して、任意の文字列キーを整数値と一致させることができます。しかし、任意の値を保存したい場合はどうでしょうか? いくつかのキーを整数と一致させ、いくつかのキーを double と一致させたいと思うかもしれません。任意の型とサイズの値を (ポインターで) 追跡できるように、構造体を定義する必要があります。このvoid *
場合、法案に適合します。
typedef struct item_t
{
char *key;
void *value;
} item_t;
ここで、値が int の場合は を使用してその値を取得できます。(int *) value
また、値が double の場合は を使用して取得できます(double *) value
。もちろん、これは、構造体を使用するコードが、どのコンテキストでどの型を期待するかを知っていることを前提としています。
ただし、C++では、これと同じ機能は通常、を使用するのでvoid *
はなく、テンプレートや、さまざまなタイプのすべてが派生するスーパークラスなどを使用して実現されます(たとえば、Javaのオブジェクトのように-オブジェクトのリストはいくつかを格納できます文字列、一部の整数など)。
これは、C/C++ でオブジェクトへのポインターを提供する最も一般的な方法です。object
C# や Java のように。
これは主に、さまざまな状態を持つことができるパラメーターを渡したい場合に使用されます。
たとえば、一般的なコードではvoid*
、をパラメーターとして渡し、そのコードの「特定の」実装では、を必要void*
なものにキャストします。
汎用コード、abc.h
void Test(void* pHandle);
Windows コード、abc.cpp
void Test(void* phandle)
{
WindowsStructure* myStruct = (WindowsStructure*)(pHandle);
myStruct->getWhatINeed;
}
Linux コード、abc.cpp
void Test(void* phandle)
{
LinuxStructure* myStruct = (LinuxStructure*)(pHandle);
myStruct->getWhatINeed;
}