1

誰かが私が次のコードを理解するのを手伝ってくれませんか:

int d = 4;
printf(&d["Hay!Hello %c\n"], &4["BuddyWorld"]);           // Hello (some address in char)
printf(&d["Hay!Hello %c\n"], 4["BuddyWorld"]);            // Hello y
printf(&d["Hay!Hello %s\n"], 4["BuddyWorld"]);            // Segmentation fault
printf(&d["Hay!Hello %s\n"], &4["BuddyWorld"]);           // Hello yWorld

printf("d[Hay!Hello %s\n"], &4["BuddyWorld"]);      
/* warning: passing argument 1 of 'printf' makes pointer 
   from integer without a cast                           */

d []または&d []演算子とは正確には何ですか?(dは整数です)なぜ&4["BuddyWorld"]4[BuddyWorld]は異なる値になりますか?(それぞれ「W」と「y」)

4

3 に答える 3

3

のようなものを書くとa[i]、それはに展開され*(a + i)ます。(糖衣構文と言いますa[i])。*(a + i)

加算は可換であるため"BuddyWorld"[4] = *("BuddyWorld" + 4) = *(4 + "BuddyWorld") = 4["BuddyWorld"]、ここで、は"BuddyWorld"暗黙的にメモリ内のアドレスを表します。

于 2012-10-22T15:05:36.450 に答える
2

Cでの添え字は奇妙です。a[b]に変換されます(ポインタ*(a + b)に追加して取得したアドレスにあるもの)。ただし、なので、逆の場合も同様に機能します()。起こっているのはそれだけです。特に、「HelloWorld」は実際には文字列の文字を格納する文字配列へのポインタです。baa + b == b + aa[b] == b[a]

于 2012-10-22T15:04:33.383 に答える
1

d["Hay!Hello %c\n"]と同じ"Hay!Hello %c\n"[d]です。

そして、&オペレーターは指摘されたコンテンツのアドレスを提供します

于 2012-10-22T15:05:05.230 に答える