奇怪的C字符串输出

奇怪的C字符串输出,c,string,C,String,当我遇到这段代码时,我正试图学习C语言中的字符串 #include <stdio.h> int main(){ char s[] = "Hello world"; printf("%s" , s); printf("%s" , &s); return 0; } #包括 int main(){ char s[]=“你好,世界”; printf(“%s”,s); printf(“%s”和“&s”); 返回0; }

当我遇到这段代码时,我正试图学习C语言中的字符串

#include <stdio.h>
int main(){
        char s[] = "Hello world";
        printf("%s" , s);
        printf("%s" , &s);
        return 0;
}
#包括
int main(){
char s[]=“你好,世界”;
printf(“%s”,s);
printf(“%s”和“&s”);
返回0;
}

两者都将helloworld作为输出。根据我的理解,这个输出对于第一种情况是可以的。第二个怎么样?请澄清。

s
&s
返回相同的地址,因此。此地址是存储“Hello world”中的“H”的位置

因为,
数组的名称衰减为数组中第一个元素的地址&

第一个元素的地址与数组的地址相同。

获取数组的地址与获取其第一个元素的地址相同。当使用数组的名称时,它也会衰减到它的第一个元素的地址-因此表达式
s
&s
产生相同的结果。

s
返回数组中第一个项的地址和
&s
返回数组本身的地址-它们恰好是相同的


一般来说,如果您希望更明确,表达式
&s[0]
也可以用于返回第一项的地址。

s相当于&s[0],因此我们传递的是s[0]的地址,而不是指向s[0]的指针的地址,因此在第二种情况下它将打印Hellow world


s是数组的名称,而不是指针。

如果您想了解技术,请选择第二个版本:

printf("%s" , &s);
具有未定义的行为,仅在意外情况下工作。通过显式获取地址,可以得到数组的地址(这很好),但结果的类型是“指向12个字符数组的指针”,而不是
printf
的%s转换所需的类型“指向字符的指针”。由于类型不匹配,因此结果是未定义的行为

然而,事实上,这纯粹是一个技术问题——我所知道的每一个C实现的代码都能很好地工作

如果你想证明差异的存在,你可以很容易地做到。例如:

char string[] = "hello world";

printf("without &: %p, %p\n", (void *)string, (void *)(string+1));
printf("with &:    %p, %p\n", (void *)&string, (void *)(&string+1));
在第一种情况下,
string
衰减为指向char的指针,因此在第一行上,第二个指针正好比第一个指针大一个。在第二行,我们向指向字符数组的指针添加一个,因此当我们添加一个时,它实际上会增加数组的大小。在我的机器上运行,我得到如下结果:

without &: 0038F96C, 0038F96D
with &:    0038F96C, 0038F978

char s[]类似于char*s,char*s是指向数组的第一个元素的字符指针(它包含存储的第一个元素的地址)。 我们还可以通过存储第一个字符的地址来存储字符串。在执行期间,计算机开始逐个从该地址提取字符,并生成字符串,直到它达到空字符('\0')。 在上面的示例中,“s”和“%s”表示相同的值(起始字符的地址),希望您能得到它。
如果您使用char s[10](固定长度数组),您将了解所有内容

试着接受你以前的回答Show来做这件事……我是新来的,所以???@Pritpal:你点击你想接受的答案旁边的勾号来回答你的每一个问题。上面的内容是否也适用于整数数组???@Pritpal:是也适用于整数数组,它与“数据类型”无关。