Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays C语言中的存储、语义和字符串文本_Arrays_C_String - Fatal编程技术网

Arrays C语言中的存储、语义和字符串文本

Arrays C语言中的存储、语义和字符串文本,arrays,c,string,Arrays,C,String,我一直在读B&K的C编程第二版。 在书的附录A中,他们定义了C的标准参考,他们说: 字符串文字,也称为字符串常量,是由“…”中的双引号包围的字符序列。字符串具有类型“`array of characters”和存储类static,并用给定的字符初始化 这意味着双引号之间的任何字符序列都具有静态存储 现在,在书的另一部分,他们说: “字符数组是初始化的一种特殊情况 可以使用字符串代替大括号和逗号符号: char pattern[]=“ould”是较长但等效的字符的缩写 char模式[]={'o',

我一直在读B&K的C编程第二版。 在书的附录A中,他们定义了C的标准参考,他们说:

字符串文字,也称为字符串常量,是由“…”中的双引号包围的字符序列。字符串具有类型“`array of characters”和存储类static,并用给定的字符初始化

这意味着双引号之间的任何字符序列都具有静态存储

现在,在书的另一部分,他们说:

“字符数组是初始化的一种特殊情况 可以使用字符串代替大括号和逗号符号:
char pattern[]=“ould”
是较长但等效的字符的缩写
char模式[]={'o','u','l','d','\0'};
在这种情况下,数组大小为五(四个字符加上终止的“\0”)

在速记语句中,字符串“ould”是否具有静态存储?或者它只是一个字符数组,就像他们所说的那样

在书的后面,他们还说:

“这些定义之间有一个重要区别:
char-amessage[]=“现在是时候了”/*一个数组*/
char*pmessage=“现在是时候了”/*指针*/
amessage是一个数组,刚好足够容纳初始化的字符序列和“\0” 数组中的单个字符可以更改,但消息将始终引用 另一方面,pmessage是一个指针,初始化为指向一个字符串常量 指针随后可能会被修改为指向其他地方,但如果您尝试 修改字符串内容。“

所以,如果我错了,请纠正我,我基本上从这一切中得到的是: 一旦程序中出现了一系列用双引号括起来的字符,它们就会留在内存中,直到程序结束才会被销毁。而且,它们作为字符数组存储在内存中,如
字符模式[]={'o',u',l',d','\0'}
。并且,当字符串出现在初始化的右侧时,如在
char模式[]=“ould”,字符串被复制到数组中,一个字符一个字符地复制到数组的索引中,并作为一个字符序列留在内存中,直到程序结束,无论模式[]是否被破坏

我很抱歉,如果这有点长,但它有点让我困惑,我在这里也读过关于这个主题的其他答案,但他们似乎没有很好的连接

一旦程序中出现了一系列用双引号括起来的字符,它们就会留在内存中,直到程序结束才会被销毁

或多或少。你可能没有意识到的是,
charmessage[]=“foo”不是作业。这是一个初始化

因此,当你有:

int func() {
    char message[] = "foo";
    ...
消息
是一个自动存储的字符数组,初始化为4个字符。事实上,它是
charmessage[]={'f','o','o','\0'的语法糖

静态常量“foo”
可能存在,但它对编译器来说是私有的,如果有的话,由实现知道它在哪里。作为一名程序员,你无法访问它,也不需要任何访问权限

如果要使用静态常量数组,必须使用指针存储其地址:

指针可以是自动的,但指针数组是静态的,可以安全地从函数返回


希望我没有增加混乱…

char模式[]=“ould”
严格等同于
字符模式[]={'o','u','l','d','\0'}。没有任何区别。一旦程序中出现了一系列用双引号括起来的字符,它们就会留在内存中,直到程序结束时才会被销毁。对除非您有
字符模式[]={o',u',l',d','\0'}
。然后您可以修改
模式
数组,例如
模式[0]='A'
您可能也对我早期的一个问题感兴趣:严格地说,字符串文字也应该存储,但是由于在数组初始化后无法访问字符串文字,所以实现可以“按原样”存储文字,因为根本不需要存储它。在
char pattern[]的情况下“ould”
这是一个初始化器,不是字符串文字,因为您没有访问权限:初始化数据被复制到数组中,就像使用
char pattern[]={'o','u','l','d','\0'};
和因为它不是
const
数组一样,可以修改它。OTOH
char*pattern=“ould”";定义一个指向字符串文字的指针变量,并且不能修改字符串数据应该是
char message[]=“foo”.oops,我真丢脸。。。谢谢你的修复。
const char *pt = "foo";