• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ポインタと二次元配列)

ポインタと二次元配列

このQ&Aのポイント
  • ポインタと二次元配列の関係について質問があります。
  • 4行目のa[ ][4]が空欄になっている理由と、8行目のpa=a[1]ではなくpa=a[0]ではだめな理由について教えてください。
  • また、プログラムの最後で二次元配列の内容を表示しています。

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

  • ベストアンサー
  • KEIS050162
  • ベストアンサー率47% (890/1879)
回答No.1

二次元配列を定義する場合、二次の方の要素数は明記しないと、配列の形が定義出来ないので省略出来ないです。 もう少し詳しく。 定義した変数が、メモリ上にどう配置されるか、が分からないと、この変数を参照する演算で、どっからメモリを持って来るかが分からなくなるので、何個の要素があるかは定義省略出来ないのです。 例えば、 int a[4][4] のある要素を参照しようとすると、 a[1][2] と記述すれば、配列2番目の3個目の要素となるので、 二次の要素数 4 × 1 + 3 = 7 この配列の先頭から7個目の要素を引っ張ってくれば良いとなりますが、二次の要素の数がわからないとこれが計算できません。 一次は、省略しても、上記の例では、3列分と決まっているので、4個(これば書略出来ない)×3個の変数領域を確保すればいいことになります。 変数の型と、その変数が どの様にメモリ上に確保される か、の辺りを良く勉強してみてください。 ここをクリアすると、構造体や共用体の時にも混乱が少なく、更に理解が深まるはずです。 ご参考に。

JZ302
質問者

お礼

ご回答ありがとうございました。お礼が遅くなってすみません。

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

> また、8行目のpa=a[1];は、なぜpa=a[0];ではだめなんでしょうか。第1行は先頭行で0行目を意味しているのではないでしょうか。 プログラムの意図によります。 「先頭から」なら通常はa[0]ですが、我々はよく1から数えます。 そのため、無駄を承知で[0]を使わない、というテクニックもあります。 このプログラム場合、a[1][0]からa[1][3]、a[2][0]からa[2][2]が0で埋まり、二次元配列は、連続した領域に並んでいるんだ、ということを実感させたいのかもしれません。

JZ302
質問者

お礼

ご回答ありがとうございました。お礼が遅くなってすみません。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

> なぜ[ ]のように空欄になっているんでしょうか。 一番外(左)の要素数に限っては、宣言上の省略が許されているからです。 こうやっておくと後から追加や削除をする時にコンパイラが勝手にサイズを決め直してくれます。 > 8行目のpa=a[1];は、なぜpa=a[0];ではだめなんでしょうか。第1行は先頭行で0行目を意味しているのではないでしょうか。 それは「第1行」の定義を決めた方に聞いてください。 「そう解釈できる」と「そう定義されている」では天地の開きがある話ですので。

JZ302
質問者

お礼

ご回答ありがとうございました。お礼が遅くなってすみません。