質問: ", i+1, j+1); scanf("%d", &a[i][j]); } } ``` に関して ``` #define N 2 int a[N][N], ``` で既に2×2の配列を行う事を宣言しているのに、(スキャンした数字をいれる箱は用意したのに)なぜ、 for(i=0;i<2;++i) for(j=0;j<2;++j) が必要なのかわかりません。 ``` #define N 2 int a[N][N], ``` でメモリを確保して、 for(i=0;i<2;++i) for(j=0;j<2;++j)よりスキャンした数字をどのような順番で入れるかを表しているとかですか? できればcpu内部でプログラムがどのように処理されているかを箱などを用いてわかりやすく説明して頂けないでしょうか? **実行したこと** for(i=0;i<2;++i) for(j=0;j<2;++j)を消して#define N 2 int a[2][2] ;のみにしたところ、スキャンした数字は使われず、すべて0で配列の計算をしていました。 スキャンした数字にアドレスを振ってfor(i=0;i<2;++i)、for(j=0;j<2;++j)でスキャンした数字を扱っているのでしょうか?仮にそうだとしても**for(i=0;i<2;++i)、for(j=0;j<2;++j)がスキャンした数字を扱うと宣言する**必要はあるのでしょうか?**宣言している部分らしきものは見えませんが。** for(i=0;i<2;++i)、for(j=0;j<2;++j)だけでは変数iとjが2になるまで+1されるだけでスキャンした数字を扱う部分には見えないのですが。 内部でどうやって処理されて計算を実現しているのか細かく理解したいです。 どうかよろしくお願いします。 また、今回のような計算のプログラムが内部でどのように処理されているかが詳しく書かれている本などありましたら是非紹介して頂けるとありがたいです。 どうかよろしくお願いします。
回答: #### ループ内でやってる事を表にまとめてみる | i | j | 表示される文字列 | scanfに渡されるアドレス | | --- | --- | --- | --- | | 0 | 0 | A[1][1] = | &A[0][0] | | 0 | 1 | A[1][2] = | &A[0][1] | | 1 | 0 | A[2][1] = | &A[1][0] | | 1 | 1 | A[2][2] = | &A[1][1] | #### ついでに2次元配列について * 箱の名前(正確には各要素へアクセスするための式) | | | | --- | --- | | A[0][0] | A[0][1] | | A[1][0] | A[1][1] | * それぞれの要素へのアドレスの1例 | | | | --- | --- | | 0x10 | 0x14 | | 0x18 | 0x1C | 上2つの表はヘッダ行を消せないMarkdownの仕様上空白行があるが読み飛ばしてください