void
タイプは一般に、タイプ情報が与えられていないことを意味します。
ポインタは 2 つの情報を伝達することを常に念頭に置いておく必要があります。ポインタが指すデータの型( int
、double
、...) は、それを解釈する方法を指定し、ポインターが指すデータのアドレスは、どこを指すかを指定します。ポイントされたデータの実際の値を取得できます。
型情報はポインターの型 ( 、、...) にありますが、データのアドレスはポインター変数に含まれる実際の値です。double
*
int
*
したがって、void
ポインター ( void *
) は型情報を指定しないポインターです。データがどこにあるかはわかりますが、それを解釈する方法はわかりません。int
そのアドレスに何かがあることはわかっていますが、それが、 、double
または空飛ぶ牛の配列であるかどうかはわかりません。そのようなデータを実際に使用するには、別の方法で (たとえば、他のマジック パラメーターを使用して) データの型情報を取得し、そのポインターを通常のポインター型にキャストしてから、通常どおり使用する必要があります。
void *
ジェネリックプログラミングに何らかのサポートを提供するために C でよく使用されます。たとえば、qsort
C ライブラリ関数を参照してください。
代わりに、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 にキャストすることは、値を破棄するための凝った方法です (コンパイラにシグナルを送って、特定の値を使用していないことを意識していることを他のプログラマーに伝えます)。