C 函数内的字符串偏移量

C 函数内的字符串偏移量,c,string,printf,puts,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 这和指针有关吗?这只

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

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
这和指针有关吗?

这只是基本的

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

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

这只是基本的

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


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

在下面的代码中

main(){
char c[] = "STRING";
puts("AKSHAY"+2);
printf("%s",c+2);
}
这里发生的事情是当你写作的时候

char c[]="STRING";
printf("%s",c+2);
这意味着c将被分解为char类型的指针,该指针保存字符串的基址,该字符串也是char*类型

所以当你写作的时候

char c[]="STRING";
printf("%s",c+2);
%s规范意味着它将采用基址,并将字符打印到空或空白处。因此c+2意味着基址+2,这就是它打印的原因

"RING"
另一方面

puts("AKSHAY"+2);
puts还获取基址并打印到NULL,包括空格

在这里,AKSHAY的类型是char*,所以向它添加2意味着将基址更改为字母S

SHAY

在下面的代码中

main(){
char c[] = "STRING";
puts("AKSHAY"+2);
printf("%s",c+2);
}
这里发生的事情是当你写作的时候

char c[]="STRING";
printf("%s",c+2);
这意味着c将被分解为char类型的指针,该指针保存字符串的基址,该字符串也是char*类型

所以当你写作的时候

char c[]="STRING";
printf("%s",c+2);
%s规范意味着它将采用基址,并将字符打印到空或空白处。因此c+2意味着基址+2,这就是它打印的原因

"RING"
另一方面

puts("AKSHAY"+2);
puts还获取基址并打印到NULL,包括空格

在这里,AKSHAY的类型是char*,所以向它添加2意味着将基址更改为字母S

SHAY

嗯,好吧,我是一个新手,你说的话我都听不懂。简单的解释会很感激:谢谢你的回答。嗯,好吧,我是一个新手,你说的话我都听不懂。简单的解释会很感激:谢谢你的回答。谢谢你的详细回答解释。谢谢你的详细解释。