汎用ポインタとは、任意のデータ型のデータのメモリアドレスを格納できるポインタのことです。
例えば、あるプログラミング言語では、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;