Arrays C语言中的存储、语义和字符串文本
我一直在读B&K的C编程第二版。 在书的附录A中,他们定义了C的标准参考,他们说: 字符串文字,也称为字符串常量,是由“…”中的双引号包围的字符序列。字符串具有类型“`array of characters”和存储类static,并用给定的字符初始化 这意味着双引号之间的任何字符序列都具有静态存储 现在,在书的另一部分,他们说: “字符数组是初始化的一种特殊情况 可以使用字符串代替大括号和逗号符号:Arrays C语言中的存储、语义和字符串文本,arrays,c,string,Arrays,C,String,我一直在读B&K的C编程第二版。 在书的附录A中,他们定义了C的标准参考,他们说: 字符串文字,也称为字符串常量,是由“…”中的双引号包围的字符序列。字符串具有类型“`array of characters”和存储类static,并用给定的字符初始化 这意味着双引号之间的任何字符序列都具有静态存储 现在,在书的另一部分,他们说: “字符数组是初始化的一种特殊情况 可以使用字符串代替大括号和逗号符号: char pattern[]=“ould”是较长但等效的字符的缩写 char模式[]={'o',
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
数组一样,可以修改它。OTOHchar*pattern=“ould”";代码>定义一个指向字符串文字的指针变量,并且不能修改字符串数据代码>应该是char message[]=“foo”代码>.oops,我真丢脸。。。谢谢你的修复。
const char *pt = "foo";