26

C に慣れていないので、void ポインターから得た唯一の実用的な使用法は、特定のポインターにさまざまなデータ型を格納できる多目的関数用です。したがって、メモリ割り当てを行うときにポインターを型キャストしませんでした。

void ポインターを使用することがあるコード例をいくつか見てきましたが、それらは型キャストされます。なぜこれが役立つのですか?ボイドの代わりに、目的のタイプのポインターを直接作成してみませんか?

4

2 に答える 2

20

C で void ポインターを別の型にキャストする理由は 2 つあります。

  1. ポインタが指すものにアクセスしたい場合 ( *(int*)p = 42)
  2. 「実際の」C ではなく、C と C++ の共通サブセットで実際にコードを記述している場合。「malloc の結果をキャストしますか? 」も参照してください。

1の理由は明らかです。2 番目の理由は、C++ ではvoid*他の型への暗黙的な変換が許可されていませんが、C では許可されているためです。

于 2013-06-07T14:43:42.240 に答える
14

void ポインターを逆参照する場合は、void ポインターを別のものにキャストする必要があります。たとえば、void ポインターを関数パラメーターとして取得し、これが整数であることを確認します。

void some_function(void * some_param) {
    int some_value = *some_param; /* won't work, you can't dereference a void pointer */
}

void some_function(void * some_param) {
    int some_value = *((int *) some_param); /* ok */
}
于 2013-06-07T14:35:50.010 に答える