1

最近我偶然发现了这个奇怪的代码:

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

它与指针有关吗?

4

2 回答 2

2

这只是基本的指针算术

字符串文字的类型是指向字符的指针,因此您可以向该指针添加偏移量以获取字符串的“尾部”。这发生在“函数内部”的事实并不重要。

您的测试不起作用,因为您无法从这样的表达式初始化数组,它必须是“裸”字符串文字。

于 2014-03-31T10:23:29.027 回答
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+2原因base address +2

"RING"

另一方面

puts("AKSHAY"+2);

puts 还获取基地址并打印到 NULL(包括 WHITESPACES)

这里的“AKSHAY”类型char *添加2到它意味着将基地址更改为字母。所以S输出是

SHAY
于 2014-03-31T10:35:49.063 回答