2012-10-22 82 views
1

誰能請幫助我理解下面的代碼:奇怪的C語法1 [「ABCDE」]?

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')

+3

'a [i]'和'我[a]'都是相同的,'*(a + i)'。這有幫助嗎? –

+0

但是我仍然沒有明白爲什麼'&4 [BuddyWorld]'和'4 [BuddyWorld]'產生不同的值? (分別是'W'和'y') – zeronone

+0

@zeronone 4 [「BuddyWorld」]是第五個字符'y''。 '&4 [「BuddyWorld」]是它的地址,即帶有偏移量的「BuddyWorld」的地址。 –

回答

2

在C中下標很奇怪。 a[b]變成*(a + b)(通過將b添加到指針a獲得的地址處的東西)。但是,自a + b == b + a以外,其他方式也如此(a[b] == b[a])。這就是所有這一切。特別是,「HelloWorld」實際上是指向存儲字符串字符的字符數組的指針。

+0

在第一個兩行,爲什麼'&4 [「BuddyWorld」]和'4 [「BuddyWorld」]會產生不同的值? – zeronone

+2

@zeronone - '4 [「BuddyWorld」]與「BuddyWorld」[4] - 字符「y」(實際上是「int」值121)相同。但'&4 [「BuddyWorld」]發生了什麼?該表達式是字符串「yWorld」(從偏移量4開始的子字符串)的地址。就好像你已經調用了'printf(「Hello%c \ n」,「yWorld」);'當你將一個字符串參數傳遞給'%c'格式轉換時會發生什麼?它將字符串的地址視爲無符號整型,並打印相應的ASCII字符。我認爲這是一個巧合,你有一個熟悉的角色(當我運行你的代碼時,我不會)。 –

+0

哦,謝謝,我明白了。這很巧合:) – zeronone

1

d["Hay!Hello %c\n"]與​​相同。

而且&運營商給出了針對性的內容

3

當你寫類似a[i]的地址,它就會擴展到*(a + i)。 (我們說a[i]句法糖*(a + i))。

加法是可交換的,所以"BuddyWorld"[4] = *("BuddyWorld" + 4) = *(4 + "BuddyWorld") = 4["BuddyWorld"],其中"BuddyWorld"隱含地代表其在內存中的地址。