質問

Ogre3D 実装のコードを読んでいますが、 void * 型変数は意味します。 C ++では、 void へのポインターは何を意味しますか?

役に立ちましたか?

解決

voidへのポインター、 void * は任意のオブジェクトを指すことができます:

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

double b = 3.14;
p = &b;

どのタイプのポインターを指しているのかわからないため、そのポインターを逆参照、増分、または減分することはできません。考えは、 void * memcpy などのメモリブロックをコピーするだけの関数に使用でき、コピーする型を気にしないということです。

他のヒント

これは単なる型のポインタであり、型がわからないときにデータを渡すために使用されます。使用するには、正しい型にキャストする必要があります。

これは、メモリ内のスポットへの生のポインタです。 char *やint *などのポインター演算は許可されません。

使用例は次のとおりです

http://theory.uwinnipeg.ca/programming/node87.html

これは 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ポインターはクラスメンバーを指すことはできません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top