- 締切済み
C ポインタに型
Cのポインタに型があるのはなぜですか? 先頭アドレスを指し示すだけならポインタ型のような「アドレスを保存します」って型で統一したほうがわかりやすくないですか?
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- unokwave
- ベストアンサー率58% (966/1654)
>1バイトの型と2バイトの型があったとして、1バイト読み込めばいいのか2バイト読み込めばいいのか判断するために型も一緒に教えてあげるってことですね。 判断は自動的に判断させるため、ですね。 それとポインタには関数ポインタというのもあります。 この場合には関数の引数の有無や型の情報も関数ポインタに含まれます。
- unokwave
- ベストアンサー率58% (966/1654)
アドレスを保持する定義型は存在します。 uintptr_tとintptr_tです。 アドレスの演算用にはptrdiff_tという定義型もあります。 ポインタは何かを指し示しています。 つまり何らかのオブジェクトを指しているわけですが、その指している先の型と合わなければ、データを正しく読み書きできる保障がなくなります。 例えるなら、役所への申請書に住所だけが書かれていて、申請の目的も何もわからないような申請書が良いと言っているようなものです。 役所の窓口では、申請者に意図を聞いて、その都度必要な事を聞きながら処理をしたほうが良いのか、必要なことをすべて書いてもらった申請書を見ながら処理をしたほうが良いのか、です。 ポインタに指しているアドレスにあるオブジェクトの型情報があれば、その型に応じた処理をこなすだけで済みます。
- superside0
- ベストアンサー率64% (463/719)
ポインタを参照して、そのアドレスの値を取り出したり、そこに代入したりするとき 先頭アドレスから 何bitを使うデータなのかが 型(int,short,long,long long, char, float, double,...等々)によって異なります。 たとえば、 32bitデータの入っていることを示しているポインタを使って そこに64bitのデータを代入してしまうと、 隣にある別のデータを壊してしまうことになります。 つまり、型の情報ないとポインタを使ったデータの受け渡しが正しく出来ません。 アドレスの大小比較だけできればよくて、 それが示している中身は関係ないという計算のときだけは、型は無視できますけど。
お礼
よくわかりました。ありがとうございます。 言われればその通りで、聞く前に気づかなかったのが悔やまれます。
- hiodraiu
- ベストアンサー率15% (451/2846)
統一したら分かりやすくなるケースってどんな場合? もしかして「先頭アドレスを指し示すだけなら」ってとこが質問の要点ですか? ポインター変数って先頭を指し示すだけじゃないですよね。次のデータを参照することもありますよね。データ型によって次のデータは何バイトずれるのかは違いますよね。
お礼
確かにそうでした。質問するとき頭が死んでいたみたいです。
int、char、アドレス。 この勉強から復讐されると良いかと思います。 なぜそれらの方があるのかを理解できればわかります。 ポインタ以前の初歩の話ですので、そちらから復讐された方が良いですよ。
お礼
はい。
- chachaboxx
- ベストアンサー率23% (412/1777)
公園に散歩に行くのに、スーツケースは合理的とは言えない感覚です。ダメというわけではありません。
お礼
はい。
- wormhole
- ベストアンサー率28% (1626/5665)
では、そのアドレスにあるデータの型はどうやったらわかりますか。 アドレスだけわかればいいというのでしたら、 typedef void * pointer; と型定義してpointerで統一してみてはいかがでしょうか。
お礼
はい。
お礼
わかった気がします。 1バイトの型と2バイトの型があったとして、1バイト読み込めばいいのか2バイト読み込めばいいのか判断するために型も一緒に教えてあげるってことですね。