2014-03-31 142 views
1

最近我偶然發現了這個奇怪的代碼裏面偏移:字符串函數

main(){ 
char c[] = "STRING"; 
puts("AKSHAY"+2); 
printf("%s",c+2); 
} 

OUTPUT:

SHAY 
RING 

能有人請解釋這個字符串是如何工作的偏移。

而且當我嘗試這個代碼片斷中,我得到一個編譯錯誤:

main(){ 
char c[] = "STRING"+2; 
printf("%s",c); 
} 

錯誤:

Line 2: error: invalid initializer 

有什麼事情做指點?

回答

2

在你的下面的代碼

main(){ 
char c[] = "STRING"; 
puts("AKSHAY"+2); 
printf("%s",c+2); 
} 

這裏發生的事情是,當你寫

char c[]="STRING"; 

這意味着c會衰變成pointer of type char持有「STRING」的基地址,該地址也是類型char *

所以,當你寫

printf("%s",c+2); 

%s規範意味着它將以基地址和打印字符高達NULL(或空格)。所以c+2base address +2所以這就是爲什麼它是印刷

"RING" 

另一方面

puts("AKSHAY"+2); 

個放也採取的基地址和打印高達NULL(包括空格)

這裏類型「阿克沙伊」是char *所以加入2到它意味着改變到字母基地址S。所以輸出是

SHAY 
+0

謝謝你的詳細解釋。 –

+0

@AkshayLAradhya no prob bro .... – YakRangi

2

這只是基本的pointer arithmetic

字符串文字的類型是指向字符的指針,因此您可以向該指針添加偏移量以獲取字符串的「尾部」。事實上,這發生在「函數內」並不重要。

由於您無法從類似的表達式初始化數組,因此您的測試不起作用,它必須是「裸」字符串文字。

+0

嗯好吧,我是一個新手,你說的所有的話剛剛超過我的頭。一個簡單的解釋將不勝感激:)謝謝你的答案,但。 –