void * |
辞書:電算用語の基礎知識 プログラミング仕様編 (PTPROGS) |
読み:ヴォイド-アスタリスク |
外語: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の引数にしているコードを見ることがある。
リンク |
通信用語の基礎知識検索システム WDIC Explorer Ver 7.04a (27-May-2022) Search System : Copyright © Mirai corporation Dictionary : Copyright © WDIC Creators club |