最近我偶然发现了这个奇怪的代码:
main(){
char c[] = "STRING";
puts("AKSHAY"+2);
printf("%s",c+2);
}
输出:
SHAY
RING
有人可以解释字符串中的这种偏移是如何工作的。
当我尝试这段代码时,我收到了编译错误:
main(){
char c[] = "STRING"+2;
printf("%s",c);
}
错误:
Line 2: error: invalid initializer
是否与指针有关?
答案 0 :(得分:2)
它只是基本的pointer arithmetic。
字符串文字的类型是指向字符的指针,因此您可以向该指针添加偏移量以获得" tail"的字符串。这种情况发生在一个函数内部#34;无所谓。
你的测试没有用,因为你不能从像这样的表达式初始化一个数组,它必须是一个"裸的" string literal。
答案 1 :(得分: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(或空格).so c+2
表示base address +2
,这就是它打印的原因
"RING"
另一方面
puts("AKSHAY"+2);
puts也取基地址并打印到NULL(包括WHITESPACES)
此类型的" AKSHAY"是char *
所以添加2
意味着将基地址更改为字母S
。因此输出
SHAY