3

これらのコード行は、以下のエラーを示しています。

int e = 5, * ePtr = &e;
void * vPtr = ePtr; 
cout << *vPtr; 

構文エラー :

「void*」はオブジェクトへのポインタ型ではありません

知っている:

  1. 任意のポインター型は、明示的なキャストなしで void ポインター型に格納できます
  2. ポインターを無効にしようとする逆参照の試みは構文エラーです

しかし、ポイント 2 を行うことができない場合、構文的に正しいことを除いて、ポイント 1 の使用は何ですか? を使用して 5 (つまり、eここ) を印刷したいvPtr..それは可能ですか?

これはうまくいきます:

int e = 5, * ePtr = &e;
void * vPtr = ePtr; //specific to generic Ok!
double * dPtr = (double *)vPtr; //to let compiler know stoarge size
cout << *dPtr; //indirectly it is vPtr i.e. a void ptr, can be deref only if cast
4

6 に答える 6

5

ポインターを参照void*するには、ポインターを互換性のある型にキャストする必要があります。

void*ポインターは C で頻繁に使用されますが、C++ では関数のオーバーロードとポリモーフィズムを実行できるため、ポインターの使用ははるかに制限されます。

Cでのポインターの使用の良い例は、void*コールバックを使用する関数です。

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
                   void *(*start_routine) (void *), void *arg);

pthread_create 関数を呼び出すと、コールstart_routineバックされます。この場合、いくつかのデータをstart_routine. スレッド ライブラリは、コールバックに渡すすべての型に対して pthread_create 関数を宣言できないため、void*代わりにその型が使用されます。

void myCallBack(void* arg) {
   int* value = (int*)arg;

   /* Do something with value: it is an int* now*/
   printf("Message from callback %d\n", *value);
}


/* Some main function or whatever... */
{ 
  /*  ... */
  int foo = 123;
  ret = pthread_create(&thread, &attr,myCallBack, &foo);

  /*  ... */
}
于 2013-05-30T07:18:38.653 に答える
2

ポインターを格納し、その型に無関心なままにしておくと便利な場合があります。これが void* の目的です。これは、純粋な C でストレージ コンテナー (リンク リスト、ハッシュ マップ) を設計するときに使用できるアプローチの 1 つです。

ポインターを使用したい場合は、ポインターを任意に参照することはできず、void* にキャストするとすべての型情報が失われるため、その型とその値を追跡する必要があります。

あなたの例では、void* と type フィールドを持つ単純な構造を使用できます。

C++ では、これらのことをポリモーフィック構造やテンプレートで実現できます。実行していることは、はるかに C スタイルです。

于 2013-05-30T07:18:23.780 に答える
1

型キャストなしeで使用してここで印刷することはできません。void*ポインターは、アドレスを格納する単純な変数ではありませんが、そのアドレスを使用して読み取る必要があるサイズをコンパイラーに伝える型も持っています。Avoid*は型を持たないため、型キャストせずに逆参照することはできません。型キャストにより、ポインターが運ぶアドレスから開始して読み取るバイト数をコンパイラーに伝えます。

void*プログラマーが他の型のポインターを簡単に格納して使用するための簡単な方法を提供します。unsigned intポインタのサイズはプロセッサに依存するため、ポインタの値を格納するためにまたは類似のものを使用することはできません。また、void*関数のポインター引数/戻り値をより一般的にするために使用できます。

于 2013-05-30T07:18:25.410 に答える
0

int ポインターを void* ポインターに格納したいのです。その状態では、「異なるサイズの整数からのポインターへのキャスト」のような警告が表示される場合があります。そのためには、最初に整数に関連するメモリボイドポインターを割り当ててから、そのボイドポインターを次のように使用する必要があります。

void *ptr = malloc(sizeof(int));
*((int*)ptr) = 5;
printf("%d\n",*((int*)ptr));
于 2013-05-30T07:33:34.847 に答える