函数内的字符串偏移量

时间:2014-03-31 10:18:37

标签: c string printf puts

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

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

是否与指针有关?

2 个答案:

答案 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