ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
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の引数にしているコードを見ることがある。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます