2014-03-31 95 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

嗯好吧,我是一个新手,你说的所有的话刚刚超过我的头。一个简单的解释将不胜感激:)谢谢你的答案,但。 –