二次元配列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");
}
}
No.1ベストアンサー
- 回答日時:
二次元配列を定義する場合、二次の方の要素数は明記しないと、配列の形が定義出来ないので省略出来ないです。
もう少し詳しく。
定義した変数が、メモリ上にどう配置されるか、が分からないと、この変数を参照する演算で、どっからメモリを持って来るかが分からなくなるので、何個の要素があるかは定義省略出来ないのです。
例えば、
int a[4][4] のある要素を参照しようとすると、
a[1][2] と記述すれば、配列2番目の3個目の要素となるので、
二次の要素数 4 × 1 + 3 = 7
この配列の先頭から7個目の要素を引っ張ってくれば良いとなりますが、二次の要素の数がわからないとこれが計算できません。
一次は、省略しても、上記の例では、3列分と決まっているので、4個(これば書略出来ない)×3個の変数領域を確保すればいいことになります。
変数の型と、その変数が どの様にメモリ上に確保される か、の辺りを良く勉強してみてください。
ここをクリアすると、構造体や共用体の時にも混乱が少なく、更に理解が深まるはずです。
ご参考に。
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で埋まり、二次元配列は、連続した領域に並んでいるんだ、ということを実感させたいのかもしれません。
No.2
- 回答日時:
> なぜ[ ]のように空欄になっているんでしょうか。
一番外(左)の要素数に限っては、宣言上の省略が許されているからです。
こうやっておくと後から追加や削除をする時にコンパイラが勝手にサイズを決め直してくれます。
> 8行目のpa=a[1];は、なぜpa=a[0];ではだめなんでしょうか。第1行は先頭行で0行目を意味しているのではないでしょうか。
それは「第1行」の定義を決めた方に聞いてください。
「そう解釈できる」と「そう定義されている」では天地の開きがある話ですので。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列を使わずに、変数名を動的...
-
配列で格納したものをmsgboxで...
-
C言語 配列の長さの上限
-
メモリの初期値
-
VB.NET 構造体の配列の検索機能...
-
擬似コード 長さがmの配列でな...
-
構造体配列を引数とするDLL作成...
-
先頭アドレスとは何ですか?
-
COBOLのINITIALIZEにあたるもの
-
銀行ATMの数字キーの配列
-
【速いブラインドタッチ】手を...
-
C++ 配列を返すには?
-
C言語でcharの足し算
-
VBで構造体の配列を関数に渡す...
-
構造体から平均点を求める方法
-
ExcelVBAで質問です。離れた二...
-
C言語初心者 構造体 課題について
-
C言語のプログラムについての質...
-
C# 配列の変数宣言について。
-
配列を含む構造体の初期値について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列の参照渡しで型が一致しま...
-
配列を使わずに、変数名を動的...
-
VBで構造体の配列を関数に渡す...
-
配列で格納したものをmsgboxで...
-
unsigned char配列への入力の仕方
-
C# Listを使わずに2次元配列の...
-
C# 配列の変数宣言について。
-
擬似コード 長さがmの配列でな...
-
【速いブラインドタッチ】手を...
-
パイソンの
-
C言語初心者 ポインタについて...
-
ExcelVBAで質問です。離れた二...
-
配列を含む構造体の初期値について
-
複数の選択範囲の行番号を個別...
-
Functionの戻り値を2次元配列...
-
C++ vectorに配列をプッシュしたい
-
先頭アドレスとは何ですか?
-
テキストファイルから文字列を...
-
Redimした動的配列はEraseする...
おすすめ情報