2016-03-07 13 views
36

これは私のコードです:なぜm [1] - m [0]は3を返します。ここで、mは3x3の行列ですか?

int m[][3] = { 
       { 0 , 1 , 2 }, 
       { 10, 11, 12 }, 
       { 20, 21, 22 } 
      }; 
printf("%d %d\n", m[1] - m[0], m[1][0] - m[0][0]); 

そして、なぜ

m[1] - m[0] 

リターン3はいますか?私はなぜ2番目の式が10を返すのか知っていますが、1 stという文字は私にとって論理的ではありません。あなたのコードで

+2

'm [1]'は '&m [1] [0]'であり、以下同様です。 – immibis

+0

技術的に、 'm'は3x3行列ではなく、配列の配列です。 – HelloGoodbye

+0

答えはまだありませんが、 'm [0]'と 'm [1]'は*配列*(ポインタではありません)です。配列値が '-'演算子のオペランドとして使用されたときに、それぞれの配列の最初の要素を指すポインタ値が生成されます。 –

答えて

55

m[1] - m[0] 

はあなたにタイプに基づいて2つのポインタの差を与えるポインタ減算を示しています。結果は、2つのポインタが減算される場合、両方が構成要素を指すものと§6.5.6

C11標準、章を引用することであるので、この場合には、両方のポインタは、3つの要素によって区別されます同じ配列オブジェクトの 、または配列オブジェクトの最後の要素の1つ前のもの。結果は2つの配列要素の添字の の違いになります。 [...]

[...]換言すれば、式Pと のに対して、それぞれ、目ij番目の要素Q点配列オブジェクトの場合、式(P)-(Q)は値i−jを持ち、値がptrdiff_tのオブジェクトに収まるものとします。 [...]

をより良く視覚化を助けるために、以下のイメージここ

enter image description here

を参照してください、ss[4][2]として定義二次元アレイです。配列コンシューマのデータ型をそれぞれ2バイトと見なし、要素(インデックス)と対応するメモリ位置(任意の)に従ってください。これは、実際にどのようにメモリに格納されているかをより控えめにするために、配列要素は連続しています。

s[0]s[1]は、s[0][0]s[0][1]の2つの要素で区別されます。 m[1]m[0]間の「差分」は三つの要素であるので、従って、s[1] - s[0] 2.

+0

ありがとうございます!これは私がそれを理解するのを助けた。私は間違いなくそのテストに合格するでしょう:) – Martacus

+0

@Martacusそれは自信です!運が良ければ:) –

+1

'm [1]'と 'm [0]'は配列であることに注意してください。あなたが記述するポインタは、「崩壊」の結果です。 –

35

の結果を生成します。

あなたがこの

 
m[0]       m[1]       m[2] 
|        |        | 
v        v        v 
+---------+---------+---------+---------+---------+---------+---------+---------+---------+ 
| m[0][0] | m[0][1] | m[0][2] | m[1][0] | m[1][1] | m[1][2] | m[2][0] | m[2][1] | m[2][2] | 
+---------+---------+---------+---------+---------+---------+---------+---------+---------+

ようにそれを見ればm[1]m[0]の違いは要素m[0][0]m[0][1]m[0][2]で理解しやすいかもしれません。

+0

ああ、これもまた説明します、ありがとう!私は今ハハのハングアップを得た。 – Martacus

+0

実際、 'm [0]'は技術的に見ると 'm [0] [0]'と同じ場所を指すことになります。 '&m [0]'と '&m [0] [0]'を使うとそれが証明されます。配列は基底とオフセットを持ち、したがって、 'm [0]'と 'm [0] [0]'はゼロオフセットとmatixのベースアドレスに等しいアドレスを持ちます。 – cst1992

+0

私が言っていることは、 'm [0]'が 'm [0] [0]'を含んでいるセルの中央であることを指していなければならないということです。 'm [1]'と 'm [2]'も同じです。 – cst1992

関連する問題