C ++のvoidへのポインター?
-
03-07-2019 - |
質問
Ogre3D 実装のコードを読んでいますが、 void *
型変数は意味します。 C ++では、 void
へのポインターは何を意味しますか?
解決
voidへのポインター、 void *
は任意のオブジェクトを指すことができます:
int a = 5;
void *p = &a;
double b = 3.14;
p = &b;
どのタイプのポインターを指しているのかわからないため、そのポインターを逆参照、増分、または減分することはできません。考えは、 void *
は memcpy
などのメモリブロックをコピーするだけの関数に使用でき、コピーする型を気にしないということです。
他のヒント
これは単なる型のポインタであり、型がわからないときにデータを渡すために使用されます。使用するには、正しい型にキャストする必要があります。
これは、メモリ内のスポットへの生のポインタです。 char *やint *などのポインター演算は許可されません。
使用例は次のとおりです
これは anything へのポインタです-ただ遊ぶことができるメモリの塊-オブジェクトかもしれないし、charかもしれません。あなたはそれで役に立つ何かをするためにキャストする必要があります。
注意:ここでのメモリアドレスはすべて架空のものです。ポイントを説明するために作成しています。
指定:
int data[] = {10,11,12};
今、次のものがあります:
0xffff0000-0xffff0003 with a value of (int)(10)
0xffff0004-0xffff0007 with a value of (int)(11)
0xffff0008-0xffff000b with a value of (int)(12)
(ここでは、ビッグエンディアンとリトルエンディアンのバイト順序をしないつもりです。)
次の場合:
int * p = data;
現在、別の場所に別のメモリの場所があります。
0xaaaa0000-0xaaaa0003 with a value of (int*)0xffff0000
p [1] [または*(p + 1)]を使用して、*(int *)(0xffff0004)[= 11]をsizeof(int)= 4および0xffff0000として参照できます+ sizeof(int)= 0xffff0004。
次の場合:
void * v = data;
現在、別の場所に別のメモリの場所があります。
0xbbbb0000-0xbbbb0003 with a value of (void*)0xffff0000.
ただし、voidには関連するsizeof()情報はありません。ポインタをインクリメントまたはデクリメントすることはできません。 0xffff0000に保存されているデータにアクセスするために逆参照することはできません。この値は生のメモリアドレスとしてのみ使用できます。
(void *)0xffff0000に保存されているデータを使用する場合、まず適切な型にキャストする必要があります。
とはいえ、(void *)は、周囲の任意のデータ構造にアドレスを渡す手段として非常に便利です。たとえば、memset()。 struct tm または struct sockaddr をゼロにするかどうかは関係ありません。構造体とそのサイズへのポインタが必要です。
(これは言うまでもありませんが、... memsetを使用してクラスインスタンスを消去し、その際に仮想ポインタテーブルを上書きすることに注意してください。)
C ++では、voidポインターはクラスメンバーを指すことはできません。