C 言語 | ポインター | 汎用ポインター
任意の型のポインターを格納できる void ポインターについて説明する。型に依存せず、関数を通じてポインターを渡すときに役立つ。
汎用型
ポインターを受け取る関数で、ポインターの型を限定したくない場合がある。たとえば、状況に応じて異なる型のポインターを受け取ったり、返したりする関数である。
型に関係なく、指定したメモリー範囲を特定の値で初期化する関数を考えてみよう。char * を受け取る方法もあるが、ほかの型のポインターを使う呼び出し側は毎回キャストする必要がある。
メモリー領域の初期化はデータ型に依存しない。このような場合は汎用ポインターを使う。void ポインターには任意の型のポインターを代入でき、キャストによって元の型に戻せる。
void ポインターの宣言
void * 変数名
void ポインターには、どの型のポインターでも代入できる。型に依存せずポインターを受け取る、簡潔な関数を作成できる。
コード 1
#include <stdio.h>
void FillMemory(void *mem , int size , char n) {
int iCount;
for(iCount = 0 ; iCount < size ; iCount++)
*((char *)mem + iCount) = n;
}
int main() {
unsigned int iCount , iArray[8];
FillMemory(iArray , 4 * 8 ,0xFF);
for(iCount = 0 ; iCount < 8 ; iCount++)
printf("iArray[%d] = %X\n" , iCount , iArray[iCount]);
return 0;
}
FillMemory() は、メモリー領域へのポインター、サイズ、初期値を受け取る。この例では 8 要素の int 配列を作成し、整数が 4 バイトであると仮定して、32 バイトを 0xFF で初期化する。
型に関係なくメモリーアドレスを受け取る関数は珍しくない。拡張性の高いシステムで実体を抽象化するときに、void ポインターを利用できる。