• 締切済み

C ポインタに型

Cのポインタに型があるのはなぜですか? 先頭アドレスを指し示すだけならポインタ型のような「アドレスを保存します」って型で統一したほうがわかりやすくないですか?

みんなの回答

  • unokwave
  • ベストアンサー率58% (966/1654)
回答No.7

>1バイトの型と2バイトの型があったとして、1バイト読み込めばいいのか2バイト読み込めばいいのか判断するために型も一緒に教えてあげるってことですね。 判断は自動的に判断させるため、ですね。 それとポインタには関数ポインタというのもあります。 この場合には関数の引数の有無や型の情報も関数ポインタに含まれます。

  • unokwave
  • ベストアンサー率58% (966/1654)
回答No.6

アドレスを保持する定義型は存在します。 uintptr_tとintptr_tです。 アドレスの演算用にはptrdiff_tという定義型もあります。 ポインタは何かを指し示しています。 つまり何らかのオブジェクトを指しているわけですが、その指している先の型と合わなければ、データを正しく読み書きできる保障がなくなります。 例えるなら、役所への申請書に住所だけが書かれていて、申請の目的も何もわからないような申請書が良いと言っているようなものです。 役所の窓口では、申請者に意図を聞いて、その都度必要な事を聞きながら処理をしたほうが良いのか、必要なことをすべて書いてもらった申請書を見ながら処理をしたほうが良いのか、です。 ポインタに指しているアドレスにあるオブジェクトの型情報があれば、その型に応じた処理をこなすだけで済みます。

tanakanono
質問者

お礼

わかった気がします。 1バイトの型と2バイトの型があったとして、1バイト読み込めばいいのか2バイト読み込めばいいのか判断するために型も一緒に教えてあげるってことですね。

回答No.5

ポインタを参照して、そのアドレスの値を取り出したり、そこに代入したりするとき 先頭アドレスから 何bitを使うデータなのかが 型(int,short,long,long long, char, float, double,...等々)によって異なります。 たとえば、 32bitデータの入っていることを示しているポインタを使って そこに64bitのデータを代入してしまうと、 隣にある別のデータを壊してしまうことになります。 つまり、型の情報ないとポインタを使ったデータの受け渡しが正しく出来ません。 アドレスの大小比較だけできればよくて、 それが示している中身は関係ないという計算のときだけは、型は無視できますけど。

tanakanono
質問者

お礼

よくわかりました。ありがとうございます。 言われればその通りで、聞く前に気づかなかったのが悔やまれます。

  • hiodraiu
  • ベストアンサー率15% (451/2846)
回答No.4

統一したら分かりやすくなるケースってどんな場合? もしかして「先頭アドレスを指し示すだけなら」ってとこが質問の要点ですか? ポインター変数って先頭を指し示すだけじゃないですよね。次のデータを参照することもありますよね。データ型によって次のデータは何バイトずれるのかは違いますよね。

tanakanono
質問者

お礼

確かにそうでした。質問するとき頭が死んでいたみたいです。

noname#252929
noname#252929
回答No.3

int、char、アドレス。 この勉強から復讐されると良いかと思います。 なぜそれらの方があるのかを理解できればわかります。 ポインタ以前の初歩の話ですので、そちらから復讐された方が良いですよ。

tanakanono
質問者

お礼

はい。

  • chachaboxx
  • ベストアンサー率23% (412/1777)
回答No.2

公園に散歩に行くのに、スーツケースは合理的とは言えない感覚です。ダメというわけではありません。

tanakanono
質問者

お礼

はい。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

では、そのアドレスにあるデータの型はどうやったらわかりますか。 アドレスだけわかればいいというのでしたら、 typedef void * pointer; と型定義してpointerで統一してみてはいかがでしょうか。

tanakanono
質問者

お礼

はい。

関連するQ&A