void *
読み:ヴォイド-アスタリスク
外語:void *

 C/C++における、ポインター変数の型の一つ。voidとともに、ANSI C以降で登場した。
目次

概要

用途
 「特に型を指定しないポインター」を表わし、その型については意識せず、単にポインターとして処理したい場合に使用される汎用のポインターである。
 C/C++のポインター変数は、例えばchar *ならchar型変数を指すポインターであり、int *ならint型変数を指すポインターである。対してvoid *は、void型変数というものは存在していない特殊なもので、ポインターではあるがその型は指定されていない。
 void *型のポインターは、代入はできるが参照ができず、参照しようとすればコンパイル時点でエラーとなる。この型で受け取ったものを参照するときには別途char *型などに型キャストせねばならない。

暗黙の型変換
 Cの場合は、void *が自動的に代入先の型に型変換される。したがって、いちいち型キャストする必要は、実際にはない。
 しかしC++の場合は暗黙的な型変換をしないため、void *を返すmallocを使う場合には必要な型変換をしなければエラーになる。

特徴

メモリー確保
 例えばmalloc関数の返却値はvoid *型である。これを必要な変数型にキャストして用いることになる。
 例えば次のように使う。
 struct HOGEHOGE *hogehoge; /* HOGEHOGEは既に定義されているものとする */
 hogehoge = malloc(sizeof(struct HOGEHOGE));
 Cの場合は、void *が自動的に型変換して代入されるため、確保するサイズさえ分かればあとは全自動である。
 しかしC++の場合は暗黙的な型変換をしないので、もしC++で使う場合は次のようにせねばならない。
 struct HOGEHOGE *hogehoge;
 hogehoge = (struct HOGEHOGE *)malloc(sizeof(struct HOGEHOGE));
 C++の場合は、面倒を避けるためメモリーはnewで確保するべきである。

メモリー解放
 mallocで確保したメモリーを解放するfree関数の引数もvoid *型である。引数として利用される場合は、どのような型を与えてもエラーにならない。
 例えば上の例の、struct HOGEHOGE *型として使われたメモリーを解放する場合は、次のようになる。
 free(hogehoge);
 C++でも、任意のポインターからvoid *へは暗黙の型変換が可能である。C++でも、freeの引数に型キャストは不要である。
 void *を使うと型を意識しないで済むため便利である反面、コンパイラーによる自動での型チェックが働かなくなるため、頻用するとバグが発生する率が高まる。
 しかし、まだvoid *が無かった時代、つまりK&Rの頃のCのfreeの引数はchar *だったため、いまも古いプログラムでは、いちいち(char *)でキャストしてfreeの引数にしているコードを見ることがある。

再検索