汎用ポインタ

汎用ポインタとは、任意のデータ型のデータのメモリアドレスを格納できるポインタのことです。

例えば、あるプログラミング言語では、voidというポインタのデータ型を使って、以下のように汎用ポインタを宣言できます。

void *p;

汎用ポインタを使うと、以下のように、任意のデータ型のデータのメモリアドレスをポインタに代入できます。

int a = 2;
void *p = &a;

この場合は、データ型が整数型のintである変数*aのメモリアドレスを汎用ポインタpに代入しています。

汎用ポインタが指し示す値の参照と書き換え

汎用ポインタpは、*pでポインタが指し示す値の参照ができません。汎用ポインタが指し示す値を参照するには、ポインタの値をキャストする必要があります。

例えば、以下のソースコードでは、(int*)のキャストを使って、*(int*)pとすることで変数*aの値である2を参照できます。

int a = 2;
void *p = &a;

同様に、汎用ポインタが指し示す値を書き換える場合は、以下のようにします。

int a = 2;
void *p = &a;
*(int*)p = 3;

汎用ポインタにおけるポインタ演算

例えば、以下のソースコードがあったとします。

int a[5] = {2, 4, 6, 8, 10};
void *p = a;

a[1]を参照するためのポインタ演算は、*((int*)p + 1)になります。

同様に、a[1]を書き換えるためのポインタ演算は、以下になります。

int a[5] = {2, 4, 6, 8, 10};
void *p = a;
*((int*)p + 1) = 5;