19

注:私は経験豊富な C++ プログラマーなので、ポインターの基本は必要ありません。それは、私が一緒に仕事をしたことvoid**がなく、自分のメンタルモデルをvoid*vs. void**セマンティクスをより簡単に覚えられるように、誰かがこれを良い方法で説明してくれることを願っています。

次のコードを検討してください: (たとえば VC++ 2005 でコンパイル)

int main() {
  int obj = 42;
  void* ptr_to_obj = &obj;
  void* addr_of_ptr_to_obj = &ptr_to_obj;
  void** ptr_to_ptr_to_obj = &ptr_to_obj;
  void* another_addr = ptr_to_ptr_to_obj[0];
  // another_addr+1; // not allowed : 'void*' unknown size
  ptr_to_ptr_to_obj+1; // allowed
}
4

5 に答える 5

33

void*何かへのポインターですが、何がわかりません。それが何であるかがわからないため、どのくらいのスペースを占めるかわからないため、ポインターをインクリメントできません。

void**へのポインタvoid*なので、ポインタへのポインタです。ポインターがどれだけのスペースを占めるかがわかっているので、ポインターをインクリメントvoid**して次のポインターを指すことができます。

于 2011-04-08T07:45:26.403 に答える
7

Avoid*は、型がコンパイラに不明なオブジェクトを指します。

Avoid**は、そのような を格納する変数を指しますvoid*

于 2011-04-08T07:45:15.670 に答える
4

Aはあらゆるものvoid *を指すことができます(関数を除く)。ポインターを指すこともできるので、他のオブジェクトを指すこともできます。void *

Avoid **は へのポインターであるため、オブジェクトを指すためにのみ使用void *できます。void *

于 2011-04-08T07:45:49.147 に答える
1

voidのように聞こえるため、誤解を招く可能性がありnullます。voidただし、不特定の型と考えたほうがよいでしょう。したがって、 avoid*は未指定の型へのポインターであり、 avoid**は未指定の型へのポインターへのポインターです。

于 2011-04-08T07:44:50.683 に答える
1

voidオブジェクトを持たないタイプです。

void *従来のスカラー型です。

void **も、たまたま を指している従来のスカラー型ですvoid *


void *何を指すにも使用できますが、初期化されていないストレージにのみ使用することを好みます。void *通常、実際のオブジェクトを指すよりも優れた代替手段があります。

于 2011-04-08T07:46:04.293 に答える