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 ポインターを利用できる。