首页 > 解决方案 > 关于 char *s 和 char s[] 如何在低级别工作的困惑

问题描述

我知道类似的问题,例如这个问题,已在此处发布和回答,但这些答案并没有为我提供完整的图片,因此我将其作为一个新问题发布。希望没关系。

请参阅以下片段 -

char s[9] = "foobar";  //ok
s[1] = 'z'             //also ok

char s[9];
s = "foobar"   //doesn't work. Why? 

但请参阅以下案例 -

char *s = "foobar";      //works
s[1] = 'z';              //doesn't work
char *s;
s = "foobar";            //unlike arrays, works here

这有点令人困惑。我的意思是我有模糊的理解,我们不能为数组赋值。但是我们可以修改它。在 的情况下char *s,我们似乎可以赋值但不能修改它,因为它是写在只读存储器中的。但我仍然无法获得全貌。

低水平到底发生了什么?

标签: carraysstringpointerschar

解决方案


char s[9] = "foobar";这是初始化。声明了一个大小为 9 的字符数组,然后其内容接收字符串"foobar",并将任何剩余字符设置为'\0'

s = "foobar"只是无效的 C 语法。您不能将字符串分配给 char 数组。使s有价值foobar。利用strcpy(s,"foobar");

char *s = "foobar";也是初始化,但是,这会将常量字符串的地址foobar分配给指针变量 s。请注意,我说的是“常量字符串”。字符串文字在大多数平台上都是常量。一个更好的方法是写const char *s = "foobar";

事实上,你的下一个任务s[1]= 'z';不会起作用,因为s它是不变的。


推荐阅读