• ベストアンサー

アドレスから値を求める

Cのアドレスで悩んでいます。 long adrBuf[4]の配列に、アドレスが入っています。 そして、 adrBuf[0]には、float型データのアドレス adrBuf[1]には、short型データのアドレス adrBuf[2]には、float型データのアドレス adrBuf[3]には、char型データのアドレス となっています。 以下のような、ことをしたいのですが、右辺の記述が わかりません。教えて下さい。 float f1 = adrBuf[0]のアドレスの値を代入 short s1 = adrBuf[1]のアドレスの値を代入 float f2 = adrBuf[2]のアドレスの値を代入

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

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

ちょっと困った問題です。 困ったというのは、 「そもそも、long型の配列にアドレスを格納しているのがおかしい」 からです。 しかしいろいろ事情もおありでしょうから、 それはおいておきます。 この場合の「アドレスの値を代入」というのは、 「アドレスに入っているデータの値」と考えていいですね? すると以下のようになります。 float f1 = *(float *)adrBuf[0]; short s1 = *(short *)adrBuf[1]; float f2 = *(float *)adrBuf[2]; テストしてないので自信がないですが、 たぶんこれでいいと思います。

nyonjiro
質問者

お礼

ありがとうございます。 少しわかりました。いろいろやってみます。

その他の回答 (1)

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

#1への補足です。 >困ったというのは、 >「そもそも、long型の配列にアドレスを格納しているのがおかしい」 >からです。 これは、アドレスを入れる配列を long adrBuf[4]; と宣言せず、 void *adrBuf[4]; と宣言すべき、と言う事です。 現在主流の処理系(CPU)ではアドレス(ポインタ)は32ビットのlong値に収まるので問題が表面化しませんが、アドレスが64ビットになっている処理系(CPU)で問題が起きるからです。 因みに、 void *adrBuf[4]; と言う宣言は「char型かshort型かfloat型か、何型へのアドレス(ポインタ)が入るか決まってないけど、とにかくアドレス(ポインタ)が4つある配列」を宣言しています。 こうしておけば、アドレス(ポインタ)が16ビットだろうが32ビットだろうが64ビットだろうが、ソースコードを書き替えず処理系に合わせてリコンパイルするだけで済みます。

nyonjiro
質問者

お礼

ありがとうございます。 ちょうど、アドレスのサイズは?と思い 調べていました。 たすかりました。

関連するQ&A