11

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

4

6 に答える 6

39

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

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

double b = 3.14;
p = &b;

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

于 2009-01-04T18:20:43.650 に答える
4

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

于 2009-01-04T18:18:48.930 に答える
3

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

使用例をいくつか紹介します

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

于 2009-01-04T18:17:41.113 に答える
2

それは何かへのポインタです - あなたが遊ぶことができる単なるメモリの塊です - オブジェクトかもしれませんし、文字かもしれません。それを使って何か役に立つことをするには、キャストする必要があります。

于 2009-01-04T18:20:31.530 に答える
1

voidポインターは、C++のクラスメンバーを指すことはできません。

于 2009-01-04T23:17:31.227 に答える
1

以前の投稿を基に...


注意:ここでのすべてのメモリアドレスは架空のものです。ポイントを説明するためにそれらを作成しているだけです。


与えられた:

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を使用してクラスインスタンスをゼロにし、その際に仮想ポインタテーブルを上書きすることに注意してください。)

于 2009-01-04T21:14:18.217 に答える