2011-12-05 19 views
4

を間接参照:我々は定義(ISO/IEC 9899:1999)によって表現*marrが発生した場合は、私は、この多次元配列を持つ多次元配列名とポインタ演算

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

は、今では述べている(と私が引用します)

オペランドが「型へのポインタ」を入力している場合は、マーが減衰するという結果は、「タイプ」

を入力しており、我々はその式に持っていますこの場合は配列へのポインタである最初の要素へのポインタに渡すので、* marrという式があるときにはサイズ3の配列を返す。だから私の質問は、(* marr)+ 1を実行するときに、配列のサイズである3ではなく1バイトだけをアドレスに追加する理由です。

私は非常に明るい人ではない私はこのような些細なことに時々立ち往生する。

ありがとうございます。

+0

"abc"のサイズは4、char a [4] = "abc"; // {'a'、 'b'、 'c'、 '\ 0'} – BLUEPIXY

答えて

1

タイプがchar(1バイト)なので1つ追加します。ただ、好き:

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

とき、それは式の中でchar *として使用されますchar [][]間接参照。あなたがやっていた

*(marr+1) 

:デリファレンス

3を追加するには、まず、次に算術演算を実行する必要があり

(*marr)+1 

最初の逆参照します。

+0

すばやくお返事ありがとうあなたが「あなたがchar [] []を参照するとき、それはchar *として表現されます。なぜならそれはなぜですか?この例ではサイズ3の配列へのポインタなので、配列の名前は最初の要素へのポインタにはならないので、型はサイズ3のchar配列ですか? – wel

+0

@wel yep、char [] [] char(*)[]への崩壊。 (あなたが言ったように、配列へのポインタ)ので、逆参照すると、char配列ができます。しかし、これを式で使用すると、最初の要素へのポインタに再び崩壊するので、char *で終わることになります。また、charへのポインタをインクリメントすると1が加算されます。代わりに*(marr + 1)を実行する場合は、最初にサイズ3の配列へのポインタに崩壊し、それをインクリメントすると、サイズのサイズ(charのサイズ3の配列)がインクリメントされます。次に、あなたはこれを逆参照します。それは一種の難しい、はい... – sidyll

+0

ありがとう私の友人私は今それを持っている。私はこれを最初に並べ替えましたが、あなたの忍耐と時間のために非常に確かなおかげでした。あなたの答えはとても役に立ちます。 – wel

3

(*marr)を1バイト進めるのは、*marrchar[3],{"abc"}であるからです。あなたはまだわからない場合:あなただけchar single_array[3] = {"abc"};を持っていた場合

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

を、どこまであなたはsingle_array + 1がメモリ内に前進することを期待しますか?あなたは*(marr + 1)なかった場合はありません3 1つのバイトの権利、この配列のタイプはcharsizeof(char)であるためには、1

で、その後、あなたはその後、3バイト離れてなることを期待することができmarr[1]、を参照することになります。 marr + 1のタイプはchar[][3]で、増分サイズはsizeof(char[3])です。

上記の2つの例についての主な違いは、ということである。

  • 最初はchar[3]に参照解除し、その後インクリメントされ、したがって、増分サイズ)sizeof(charあります。
  • 2番目の数字はchar[][3]であるため、インクリメントのサイズはsizeof(char[3])であり、逆参照です。
+0

あなたの答えがありがとう、ありがとうと非常に感謝しています。あなたは素晴らしいです。 – wel