2013-05-28 75 views
2

我想弄清楚這段代碼是如何工作的,有人可以幫我運行下面這個過程: 像*(++cp)是什麼意思?我在想我= str + 7*oddNums = 1 oddNums數組的開始。 這樣str + 8數學後= ld 對不起,我真的不明白。用指針打印

int main() 
{ 
    int oddNums[5] = {1, 3, 5, 7, 9}; 
    char str[20] = "Hello world"; 
    int *ip = oddNums; 
    char *cp = str + 6; 

    printf("\n.%c",*(++cp) + *oddNums); 


    return EXIT_SUCCESS; 
} 
+0

它需要'#include '和'#include '。 –

回答

9
printf("\n.%d",*(++cp) + *oddNums); 

打破它。這相當於:

++cp; 
printf("\n.%d", *cp + *oddNums); 

第一條語句增量cp所以現在cp == str + 7。在改性的printf收率更換cp

printf("\n.%d", *(str + 7) + *oddNums); 

*(str + 7)相同str[7],這是單個字符'o'*oddNums是1.執行一個最終取代收率:

printf("\n.%d", 'o' + 1); 

它打印的字符'p'。或者說,它會打印出'p' 的ASCII值,因爲我們有%d格式,而不是%c

+1

+1(肯定荒謬)nitpick:在編譯器/系統碰巧使用的任何字符集中打印「o」+ 1「的十進制值。儘管如此,ASCII很可能。 –

+0

是的,它的意思是打印字符。它的意思是ASCII數學。 'o'+ 1 ='p' –

3
int oddNums[5] = {1, 3, 5, 7, 9}; 

這創建了一個數組5 int s。如果你參考oddNums[2],那會給你5。如果您參考oddNums,那是指向int的指向數組的開頭的指針。所以*oddNums會給你1,*(oddNums+1)會給你3,依此類推。

char str[20] = "Hello world"; 

查看我的關於oddNums的討論,這裏適用。這也是一個字符串,這意味着它在字母d後以零結尾。

int *ip = oddNums; 

還記得oddNums是一個指向整數的指針。所以這只是將它複製到另一個int指針ip

char *cp = str + 6; 

此值(str + 6)分配給char指針cpstr是一個char指向上面定義的字符串的指針。它指向字符串「Hello world」的開頭。

printf("\n.%d",*(++cp) + *oddNums); 

*(++cp)意味着得到什麼cpcp已遞增。換句話說,預增量cp,然後得到它指向的內容。 cp指向str + 6,這是字符串中的w。但++cp使它指向「世界」中的'o'。因此*(++cp)將產生'o'。

然後'o'被添加到任何oddNums指向。自從我們開始以來,oddNums沒有發生任何事情,所以它仍然指向整數數組中的1。 *oddNums表示「給我什麼oddNums點」,這是1

所以*(++cp) + *oddNums值將是'o' + 1,這是「P」(在ASCII序列中的一個字母)。

有趣的是,printf表示「在打印換行符和句點後打印出您作爲整數給出的東西」(「\ n。%d」)。所以結果會是...... .112。我認爲。

+0

(編輯修復格式和錯字) – lurker