- ベストアンサー
voidポインタ
曖昧な質問になってしまいますが、voidポインタを使うことによって どのような利点があるのかが解りません、あらゆるポインタ型から キャスト可能だということは解るのですが、具体的な使用方法がわかりません よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
利点は、おっしゃっていることそのまんまです。 たとえば、「どんな型の変数を代入する必要があるか全く分からない」という状況があったとします。 もしかしたら struct tm* かもしれないし、もしかしたら int* かもしれない。あるいは char* かもしれない。 これらのどれもが代入する必要がある可能性がある場合、先を見越して型を決めておくことができません(union で対処できる場合はいいですが)。 そこで、void* 型を「何でもいいよ」という意味で宣言しておくんです。 memcpy 関数の第1引数は void* で宣言されていますが、これは、どんなメモリーをどんな形でコピーする必要があるか、まったく分からないからです。
その他の回答 (2)
- HogePiyo
- ベストアンサー率57% (24/42)
> int *buf; > > buf = ( int * )malloc( sizeof( char ) * 10 ); 訂正。 int *buf; buf = ( int * )malloc( sizeof( int ) * 10 ); でした。すいません。
お礼
いいえ、とんでもないです、回答ありがとう御座いました。 私自身、Cを始めたばっかりなのでmallocに キャスト演算子を付けてすらいませんでした ので勉強にもなりました。
- HogePiyo
- ベストアンサー率57% (24/42)
具体例をあげれば動的にメモリ確保する malloc や realloc など、型の違うポインタを返す関数の戻り値や、型の違うポインタを引数に取る関数など。また、関数へのポインタなど。 どんな型がそこに来るのかわからないという場合いくらでも利点はあります。 ちなみに malloc なら、戻り値が void* で、 char *buf; buf = ( char * )malloc( sizeof( char ) * 10 ); で char 型のサイズが10個ある配列の先頭要素へのポインタが取得できます。つまり char 配列を確保しています。 ここで、 int *buf; buf = ( int * )malloc( sizeof( char ) * 10 ); とすると今度は int 型の配列が確保できたりします。
お礼
回答ありがとう御座いました。 そうですね、memcpyなどは普段何も考えずに使って いたので気付きませんでした。 初心者なのでまた質問するかもしれませんが その時はまたお願いします。