web-dev-qa-db-ja.com

なぜvoidポインターを型キャストするのですか?

Cが初めてなので、ボイドポインターから得た唯一の実用的な使用法は、特定のポインターに異なるデータ型を格納する可能性のある汎用機能です。したがって、メモリの割り当てを行うときに、ポインターを型キャストしませんでした。

時々voidポインターを使用するコード例をいくつか見ましたが、それらは型キャストされます。なぜこれが便利なのですか?無効ではなく、目的のタイプのポインターを直接作成しないのはなぜですか?

19
Ann

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

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

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

17
wolfgang

例えば、関数パラメーターとして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 */
}
9
Guillaume