4

私はこの多次元配列を持っています:

char marr[][3] = {{"abc"},{"def"}};

ここで、*marr定義による式(ISO / IEC 9899:1999)に遭遇すると、次のようになります(引用します)

オペランドのタイプが「タイプ」へのポインタの場合、結果のタイプは「タイプ」になります。

その式には、marrが最初の要素へのポインター(この場合は配列へのポインター)に減衰するため、式* marrがあると、サイズ3の「type」配列が返されます。だから私の質問は、(* marr)+ 1を実行すると、配列のサイズである3ではなく、アドレスに1バイトだけを追加する理由です。

私の無知をすみません、私はあまり明るい人ではありません。私は時々このような些細なことに行き詰まります。

お時間をいただきありがとうございます。

4

2 に答える 2

3

(*marr)インクリメントが1バイト進む理由は、*marrを参照しているためです。まだわからない場合:char[3]{"abc"}

*marr == marr[0] == &marr[0][0]
(*marr) + 1 == &marr[0][1]

もしあなたがちょうど持っていたら、あなたは記憶の中でどこまで前進するchar single_array[3] = {"abc"};ことを期待しますか?この配列の型は1でsingle_array + 1あるため、3ではなく1バイト右です。charsizeof(char)

を実行した場合は*(marr + 1)、を参照していることmarr[1]になります。これは、3バイト離れていると予想できます。marr + 1タイプchar[][3]は、増分サイズはsizeof(char[3])です。

上記の2つの例の主な違いは、次のとおりです。

  • 最初のものはに逆参照されてからchar[3]インクリメントされるため、インクリメントサイズはsizeof(char)になります。
  • 2つ目は、をインクリメントするchar[][3]ことです。したがって、インクリメントサイズはsizeof(char[3])、であり、次に間接参照します。
于 2011-12-05T20:45:07.740 に答える
1

タイプがchar(1バイト)であるため、1を追加します。と同じように:

char *p = 0x00;
++p; /* is now 0x01 */

間接参照するchar [][]と、式のように使用されchar *ます。

3を追加するには、最初に算術演算を実行してから、間接参照する必要があります。

*(marr+1)

あなたがやっていました:

(*marr)+1

これは最初に逆参照します。

于 2011-12-05T20:13:30.407 に答える