2010-08-25 62 views
27

我見過用C做過:「12345」+ 2在C中做了什麼?

#define MY_STRING "12345" 
... 
#define SOMETHING (MY_STRING + 2) 

什麼做一些事情得到擴展到,在這裏?這是否合法?還是他們的意思是這個?:

#define SOMETHING (MY_STRING[2]) 
+21

那麼你沒有編譯器? – rook 2010-08-25 22:22:13

+0

有時候要求堆棧溢出比在編譯器上試用更快...... – Joe 2010-08-25 22:32:40

+7

更快? http://codepad.org/VRZvcphU帶我走了60秒... – bta 2010-08-25 22:39:51

回答

81

字符串文字存在於程序的固定數據段中,因此它們在編譯器中顯示爲一種指針。

+-+-+-+-+-+--+ 
|1|2|3|4|5|\0| 
+-+-+-+-+-+--+ 
^ MY_STRING 
    ^MY_STRING + 2 
+37

ASCII藝術的+1。 – Skurmedel 2010-08-25 22:24:25

+2

人們可以用Unicode來做這個(使用+符號)嗎? – 2010-08-25 22:25:14

+0

我也喜歡ASCII藝術,所以我必須投票選擇這一個作爲答案。 – Joe 2010-08-25 22:35:53

20

當你有一個數組或指針,p+x相當於&p[x]。所以MY_STRING + 2相當於&MY_STRING[2]:它產生字符串中第三個字符的地址。

注意當您添加0 MY_STRING + 0相同&MY_STRING[0]會發生什麼,這兩者是相同的,因爲一個字符串參考書寫簡單MY_STRING無非是一個指針更字符串中的第一個字符。令人高興的是,那麼身份操作「加0」是一個空操作。考慮這種心理單元測試,我們可以用它來檢查我們對於+意味着什麼是正確的想法。

+1

我想我的掛斷是我不知道引用的字符串是否等於字符數組,至少在語法上。謝謝。 +1。 – Joe 2010-08-25 22:34:16