Ogre3D実装のコードを読んでいるのですが、void *
型変数の意味がわかりません。void
C++ でのポインタの意味は何ですか?
6 に答える
void へのポインターは、void*
任意のオブジェクトを指すことができます。
int a = 5;
void *p = &a;
double b = 3.14;
p = &b;
指している型がわからないため、そのポインターを逆参照、インクリメント、またはデクリメントすることはできません。アイデアは、メモリブロックをコピーするだけで、コピーするタイプを気にしないvoid*
ような関数に使用できるということです。memcpy
これは、型がわからない場合にデータを渡すために使用される単なる汎用ポインターです。使用するには、正しい型にキャストする必要があります。
これは、メモリ内のスポットへの生のポインターです。char * や int * などのポインター演算は許可されません。
使用例をいくつか紹介します
それは何かへのポインタです - あなたが遊ぶことができる単なるメモリの塊です - オブジェクトかもしれませんし、文字かもしれません。それを使って何か役に立つことをするには、キャストする必要があります。
voidポインターは、C++のクラスメンバーを指すことはできません。
注意:ここでのすべてのメモリアドレスは架空のものです。ポイントを説明するためにそれらを作成しているだけです。
与えられた:
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()。structtmとstructsockaddrのどちらをゼロにするかは関係ありません。構造体とそのサイズへのポインタが必要です。
(これは言うまでもありませんが、... memsetを使用してクラスインスタンスをゼロにし、その際に仮想ポインタテーブルを上書きすることに注意してください。)