• ベストアンサー

void型へのポインタ

というのがC言語にありますよね? このvoid型へのポインタというのは、 どのようにイメージすればいいのでしょうか? 例えばchar型へのポインタなら、 指している領域は 1バイトの領域ですよね? ではvoid型は? また malloc関数を 使って char *p; p=(char *)malloc(1000); とするとでchar型にキャストしているから、 1個1バイト分の領域が1000個用意して、 先頭アドレスをpに格納するのですよね? では、 int *q; q=(int *)malloc(1000); としたら、用意されるのは、int型にキャストしているから 1個2バイト分の領域が500個用意されるのでしょうか? お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

malloc(1000)とした場合、(int*)としようが(char*)としようが、常に1000バイトの領域が確保されます。この1000は、確保するバイト数を示します。 その結果、p=(char*)とした場合は、その領域を文字型のデータがあると(1000個ある)と見なしているだけです。 q=(int*)とした場合は、その領域にint型のデータがある(1000バイトに入るのは500個)と見なしているだけです。(今回はint型は2バイトとします。最近は4バイトが流行ですが・・・)

Judau_MSZ-010
質問者

お礼

ありがとうございます。 そうでした、たしかint型は4バイトでした すいません。

その他の回答 (3)

  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.4

void型へのポインタは、どの型のポインタかを明示しないポインタですから 利用する時は適当な型にキャストする必要があります。 こちらの 「初級編 5.ポインタの型」のところをご覧ください。 http://maborosi.kobe-du.ac.jp/sugiura/soft/tora/index.htm >1個2バイト分の領域が500個用意されるのでしょうか? キャストに関係なく1000バイト分が確保されます。 #2で指摘されているようにint型は2バイトとは限りません。 むしろ32ビットOS上のC言語は4バイト(32ビット)が普通です。

参考URL:
http://maborosi.kobe-du.ac.jp/sugiura/soft/tora/index.htm
Judau_MSZ-010
質問者

お礼

ありがとうございます。 読んでみます。 <むしろ32ビットOS上のC言語は4バイト(32ビット)が普通です。 私が読んでいる本にはint型は16ビットとしてたので、、 最近は32ビットなんですね、

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

#1です。void型のポインタは、単純にメモリのアドレスを示す為に使います。つまりvoid *pとしたとき、pが指すところに何の型かは不明だが、とにかくそこにデータがあるという場合です。では、このデータをどうやって操作するかというと、具体的な型を持ったポインタに代入してから使用します。char *a; a=p;のようにです。(この場合はそこに文字型のデータがある場合です。)もし、ここでint *b; b=p;とした場合は、int型のデータがそこにあると見なしたことになります。void型をつかうのは、とにかくアドレスを記憶したが、まだ何の型として使うかがその時点で、決まっていない場合が多いです。(char*型を使っているひとも多く見かけます。この辺は趣味の問題です) 余談ですが、char *a;をa++とすると1バイト増加し、int *b; をb++とすると2バイト増加しますが、void *c;をc++するとこれは、コンパイルエラーになります。

Judau_MSZ-010
質問者

お礼

ありがとうございます。

  • abayama
  • ベストアンサー率48% (38/79)
回答No.2

char型のポインタの先が1バイトとは限りません。例えば char buf[10]; char *p; void *q; p = buf; というコードの場合、pもqも10バイトの領域を指します。 mallocの引数は純粋にバイト数であって、何型にキャストするかはまったく無関係です。int型のサイズが何バイトかは処理系に依存するので、500個分intの領域がほしいならば int *q; q = (int *)malloc(sizeof(int) * 500); if (q == NULL) /* mallocにしくじった時のエラー処理 */ と書くべきです。

Judau_MSZ-010
質問者

お礼

ありがとうございます。 q = (int *)malloc(sizeof(int) * 500); のように書いたのを思い出しました、 これで、int型の領域が500個 できるんですね?

関連するQ&A