アプリ版:「スタンプのみでお礼する」機能のリリースについて

二次元配列a[ ][ ]の第1行の要素以後を0にするプログラムで動きます。

疑問なんですが、4行目のa[ ][4]は、なぜ[ ]のように空欄になっているんでしょうか。

また、8行目のpa=a[1];は、なぜpa=a[0];ではだめなんでしょうか。第1行は先頭行で0行目を意味しているのではないでしょうか。

#include <stdio.h>
void main(void) /*ポインタと二次元配列*/
{
static int a[ ][4]={{1,2,3,0},
{4,5,6,0},
{7,8,9,-999}};
int j,k,*pa;
pa=a[1];
while(*pa!=-999){
*pa=0;
pa++;
}
for(j=0;j<3;j++){
for(k=0;k<4;k++)
printf("%5d",a[j][k]);
printf("\n");
}
}

A 回答 (3件)

二次元配列を定義する場合、二次の方の要素数は明記しないと、配列の形が定義出来ないので省略出来ないです。



もう少し詳しく。

定義した変数が、メモリ上にどう配置されるか、が分からないと、この変数を参照する演算で、どっからメモリを持って来るかが分からなくなるので、何個の要素があるかは定義省略出来ないのです。

例えば、
int a[4][4] のある要素を参照しようとすると、

a[1][2] と記述すれば、配列2番目の3個目の要素となるので、

二次の要素数 4 × 1 + 3 = 7
この配列の先頭から7個目の要素を引っ張ってくれば良いとなりますが、二次の要素の数がわからないとこれが計算できません。

一次は、省略しても、上記の例では、3列分と決まっているので、4個(これば書略出来ない)×3個の変数領域を確保すればいいことになります。


変数の型と、その変数が どの様にメモリ上に確保される か、の辺りを良く勉強してみてください。
ここをクリアすると、構造体や共用体の時にも混乱が少なく、更に理解が深まるはずです。

ご参考に。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/06/24 09:33

> また、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で埋まり、二次元配列は、連続した領域に並んでいるんだ、ということを実感させたいのかもしれません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/06/24 09:33

> なぜ[ ]のように空欄になっているんでしょうか。



一番外(左)の要素数に限っては、宣言上の省略が許されているからです。
こうやっておくと後から追加や削除をする時にコンパイラが勝手にサイズを決め直してくれます。

> 8行目のpa=a[1];は、なぜpa=a[0];ではだめなんでしょうか。第1行は先頭行で0行目を意味しているのではないでしょうか。

それは「第1行」の定義を決めた方に聞いてください。
「そう解釈できる」と「そう定義されている」では天地の開きがある話ですので。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/06/24 09:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!