voidタイプは一般に、タイプ情報が与えられていないことを意味します。
ポインタは 2 つの情報を伝達することを常に念頭に置いておく必要があります。ポインタが指すデータの型( int、double、...) は、それを解釈する方法を指定し、ポインターが指すデータのアドレスは、どこを指すかを指定します。ポイントされたデータの実際の値を取得できます。
型情報はポインターの型 ( 、、...) にありますが、データのアドレスはポインター変数に含まれる実際の値です。double*int*
したがって、voidポインター ( void *) は型情報を指定しないポインターです。データがどこにあるかはわかりますが、それを解釈する方法はわかりません。intそのアドレスに何かがあることはわかっていますが、それが、 、doubleまたは空飛ぶ牛の配列であるかどうかはわかりません。そのようなデータを実際に使用するには、別の方法で (たとえば、他のマジック パラメーターを使用して) データの型情報を取得し、そのポインターを通常のポインター型にキャストしてから、通常どおり使用する必要があります。
void *ジェネリックプログラミングに何らかのサポートを提供するために C でよく使用されます。たとえば、qsortC ライブラリ関数を参照してください。
代わりに、NULLポインタは何も指さないポインタです。この場合、ポインターに関する一般的な型情報は存在しますが、存在しないのは、ポイントされたデータのアドレスです。もちろん、 を持つvoid *ことは可能ですNULL。
v簡単な例(として宣言されていると仮定double v;):
Type information present
+----------------------+----------------------+
| ✔ | ✘ |
+---+----------------------+----------------------+
p c | | | |
v o o | ✔ | double * ptr = &v; | void * ptr = &v; |
a i n | | | |
l n t +---+----------------------+----------------------+
i t e | | | |
d e n | ✘ | double * ptr = NULL; | void * ptr = NULL; |
d t | | | |
+---+----------------------+----------------------+
雑学:NULLは、少なくとも現在の標準では、0 であることが保証されています。
言語の他の領域では、void型の欠如を指定するために常に使用されます。それを戻り値として使用する (注: 今はvoid, ではなくについて話しているvoid *) ということは、関数が値を返さないことを意味し、式を void にキャストすることは、値を破棄するための凝った方法です (コンパイラにシグナルを送って、特定の値を使用していないことを意識していることを他のプログラマーに伝えます)。