2016-10-30 3 views
-2

ここにコードがあります。理解してもらえますか?2次元配列を理解する

今のところの私の理解
/* Two dimensional array */ 

#include <stdio.h> 

void main() { 
    int i, j, sum[2], mean[2]; 
    int mark[3][2] = { { 34, 56}, { 48, 65}, { 53, 59} }; 

    for (j = 0; j < 2; j++) 
     sum[j] = 0; 
    for (i = 0; i < 3; i++) { 
     for (j = 0; j < 2; j++) { 
      sum[j] = sum[j] + mark[i][j]; 
     } 
    } 
    for (j = 0; j < 2; j++) 
     mean[j] = sum[j]/3; 
    printf("Average mark in Mathematics is %d\n", mean[0]); 
    printf("Average mark in Chemistry is %d\n", mean[1]); 
} 

....

i、jは、合計が[2]、[2]の整数として意味のデータ型を定義します。

配列....の初期化は、データ型intであり、配列は3行2列でなければなりません。

最初のforループ、jは0で初期化されます。条件:jは2より小さくなければなりません。update:jの値に1を加えます。 j = 0の和。

また、2番目のループでは、iは0で初期化されます。条件:iは3未満でなければなりません。更新:iの値に1を加算します。

forループと値jを使用する次の行と同様です。

私は少し構文が混乱しています: sum [j] = sum [j] + mark [i] [j];これは、jの合計を計算し、それを[i]と[j]と表示された配列に含まれるマークに追加します。

これが完了した後、同様のjループは以前のループとどのように相互作用するかわかりません。

平均計算値と画面に印刷された値。合計は、[1]も0

である理由

私が働い例を見てきました

... 合計が[0] = 0との和[1] = 0、私は本当に理解していませんまず、I = 0及びj = 0、[0] =合計[0] +マーク[0,0]

次にJ =​​ 1つの

和[1] =和

和[1 ] +マーク[0,1]

次に

I = 1、J = 0 和[0] =合計[0] +マークし、[1,0]

和[1] =和[1] +マーク[1 、1]

次にI = 2、J = 0

和[0] =合計[0] +マーク[2,0]

次いで

和[1] =合計[1] +マーク[2,1]

私は、ループがお互いにやりとりする方法と、iとjの値を混乱させる方法を少し混乱させています。

2d配列がテーブルにあることはわかっています(ここではフォーマットできないようです)。

誰かがこれを少し気にすることができれば分かりますか?

+0

"ループはどうやって相互にやりとりされているのか、私は全面的にiとjの値を混同しています。"デバッガを使用してコードをステップ実行します。またはペンと紙。 – kaylum

+0

良いデバッガは 'gdb'でしょう。 –

+0

これは非常に基本的なプログラミング知識です... – norbertoonline

答えて

2

sum[j] = sum[j] + mark[i][j];は、sum[j] += mark[i][j];として簡略化することができます。配列のセルの内容と、2次元マトリックスmarkの列jを、配列sumj番目の要素に追加します。

2D配列の要素へのアクセスは、mark[i, j]ではなく、mark[i][j]となります。表現i, jiを評価し、コンマ式で、それを破棄し、jの評価:mark[i, j]は構文エラーではないことを

注意。したがって、マトリックスセルではなく、2Dマトリックスの第1行への参照であるmark[j]と同じです。

-4

いいえ、配列は実際にはポインタ(別名アドレス)です。 int sum[2]を定義するとき、sumは、2つの整数の配列の最初の要素のアドレスです。

合計はint*またはint[](同じ)です。

マークは2次元配列です。 Markは実際に配列の配列です。だからマークにはアドレスが含まれていて、アドレスにはいくつかの配列があります。

(実際にはメモリ内で異なる場合がありますが、コンパイラはその作業を行います)。

マークはint**、またはアドレスがintのアドレスです。

あなたは:

for (i = 0; i < 3; i++) { 
    for (j = 0; j < 2; j++) { 
     sum[j] = sum[j] + mark[i][j]; 
    } 
} 

あなたはこのよう

for each line i in the array, I want to do: 
    for each value j in the line, I want to do: 
     ...; 

を言っていたならば、あなたは(あなたが望むように視覚化する、または列)ごとに「ライン」上で動作するようにそれはだ、とすべての "行"について、あなたはあらゆる価値観に取り組んでいます。

+2

これは非常に混乱します:*配列は実際にはポインタ(別名アドレス)*です。配列は**ポインタではありません**。配列は一連の値を含むオブジェクトであり、ポインタはそのようなオブジェクトのアドレスを含むことができる変数です。 2D配列は単純に配列の配列です。 *マークにはアドレスが含まれており、それらのアドレスはいくつかの配列の始まりです。*これは完全に間違っています。 'mark'は** ** int **ではなく、2つの' int'値の3つのグループを含むオブジェクトです。関連するポインタはありません。私はめったに答えをdownvoteしないが、これは役に立たない。 – chqrlie

+0

いいえ、それは本当です。配列はポインタです。 printf( "%p \ n"、sum);を実行しようとすると、あなた自身が表示されます。メモリ内の配列はちょうど連続した領域ですが、変数は最初の要素のアドレスです。 sum [3]を実行すると、*(sum + 3)のようになり、ポインタになります。 mallocで配列を作成することもできます。または、 "int * ptr = sum"を割り当てることができます。問題なく動作します。 – Ludonope

+1

いいえ、配列はポインタではありません。配列式は、すべてのコンテキストではなく、一部ではポインタ式に変換されます。配列オブジェクトに 'sizeof'を適用してみてください。誤報を広める前に、[comp.lang.c.FAQ](http://www.c-faq.com)のセクション6をお読みください。 –