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の引数にしているコードを見ることがある。

関連する用語
C
C++
void

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club