• ベストアンサー

ポインタと多次元配列についての質問です

私の使っている本に、 『ポインタを使って多次元配列にアクセスするには、コンパイラが自動で行っていることを手作業で 行わなければなりません。たとえば、次の配列には各列に5つの要素があります。 float balance[10][5]; したがって、ポインタを使ってbalance[3][1]にアクセスするには、次のようなコードを使用 しなければなりません。 float *p; p = (float *) balance; *(p + (3*5) +1) 目的の要素に到達するには、行番号に行の要素数を掛けてから、その要素の行内での番号を 加えなければなりません。上記の例では、balanceをfloat* にキャストする必要がありました。 配列要素を手作業で指定する都合上、ポインタ演算をfloatポインタに基づいて行わなければなりません。 しかし、balanceによって生成されるポインタの型はfloatの2次元配列です。そこでキャストが 必要になるわけです。』 とあります。 【質問1】なぜ、p = (float *) balance; なのか。p = (float) *balance; ではないのか? 【質問2】本文「上記の例では………必要になるわけです。」の意味がわかりません。 未熟者の私ですがどうか教えてください。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

1) pがfloat*であり balanceはfloatの配列です 両者の型が同一ではないのでキャストが必要です p = balance; では一致しないので 右辺『balance』を左辺『p』にあわせます p = (float*)balance; となります (float)*balance といった記述はしません これだと ポインタ変数balanceの指している中身をfloat型へキャストすると言う意味になります

Guchiken
質問者

お礼

さっそくの回答ありがとうございます! float*型とfloatの配列は、まったく別の型なんですね! 同じfloatだから、キャストしなくても良いんじゃないかと思って 質問しました。 回答ありがとうございました。

その他の回答 (1)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

単に p を float* 型に宣言するからキャストが必要になっているだけでしょう。 float (*p)[5]; と宣言すれば、5個の要素からなる float 型の配列へのポインタになるから p = balance; と普通に代入して、 printf("%f\n",p[3][1]); と普通にアクセスできます。

Guchiken
質問者

お礼

回答ありがとうございます! 独学でプログラムの勉強をしているので、ためになります。 コードのサンプル、参考にさせていただきます! 回答ありがとうございました!

関連するQ&A

専門家に質問してみよう