★voidポインタ★


ここでは、voidポインタについて説明します。

voidポインタとは特別なポインタです。

通常のポインタは型の異なるポインタの代入は出来ませんでした。

voidポインタはどんな型のポインタも代入することが出来るのです。

試しに次のプログラムを打ってみてください。

<sample program col034-01>

int main(void)
{
    int data = 12;

    int *pData = &data;

    void *pVoid = pData;

    return 0;
}

コンパイルしてもエラーになりません。


では、通常のポインタと同じく「*」を付けることで間接的に元のデータにアクセスすることが出来るでしょうか。

やってみましょう。

<sample program col034-02>

#include <stdio.h>

int main(void)
{
    int data = 12;

    int *pData = &data;

    void *pVoid = pData;

    printf("%d\n", *pVoid);

    return 0;
}

コンパイル時にエラーが出てしまいました。

  error C2100: 間接指定演算子 (*) の使い方が正しくありません。

voidポインタはどんな型のポインタでも代入出来ますが、逆に何型のポインタか分からないのでそのままでは使えないのです。

これを使うには別のポインタにキャストして使う必要があります。

<sample program col034-03>

#include <stdio.h>

int main(void)
{
    int data = 12;

    int *pData = &data;

    void *pVoid = pData;

    printf("%d\n", *(int*)(pVoid));

    return 0;
}

<実行結果>

12
続行するには何かキーを押してください・・・

間接的に変数dataの中身である「12」が表示されました。

*(int*)(pVoid)

これは何をしているかというと、

void型のポインタを一旦int型のポインタにキャストして変換し、その中身を表示しています。

(int*)(pVoid)

この時点でvoid型ポインタからint型ポインタに変換されています。


では、このvoidポインタの使い道は何でしょう?

1つはmalloc関数で使います。

malloc関数は指定したサイズ(バイト数)のメモリ領域を確保する関数です。

何型の変数や配列のメモリ領域を確保するか分からないので、とりあえず指定されたバイト数分メモリを確保します。

確保できたら、先頭アドレスを戻します。

ただし、何型か分からないのでvoidポインタでアドレスを戻すのです。

受け取った方は、はっきりとした型を指定して受け取る必要があります。

<sample program col034-04>

#include <stdlib.h>

int main(void)
{
    int *p;

    p = (int*)malloc(sizeof(int));

    free(p);

    return 0;
}

malloc関数の前の、

(int*)

というキャストが無ければエラーになります。


他にも、C言語の標準関数である qsort という関数で使う事があります。

qsort については「関数ポインタ」のところで説明します。


ブラウザの戻るボタンで戻ってください。