为什么字符数组需要以NULL结尾? 例如,为什么整数数组不需要在末尾添加分隔符?
char[]
不必以 NUL 结尾。这是一种约定,用于将 char 数组用作字符串时。您可以在没有终止符的情况下为自己的目的使用 char[]。
你不需要使用 C
的 char[]
来进行空终止,而是需要使用 string
。因为在 C
中,string
意味着一个以 null 为空结尾的字符数组,而 \0
null 终止符 告诉库字符串的结束位置。
为什么?
因为最初的 C
是一种基本语言,抽象程度较低,没有将 string
作为数据类型。在 C
中,string
只是一组 char
的集合。
更明确地说,技术上并没有叫做 string
的数据类型,它只是为了方便程序员使用而实现的外观,是一个常用的高级概念,通常使用基本数据类型 char
实现。
char[]
的指针;它是字符序列。你可以有一个指向字符串的指针;这个指针本身并不是字符串。 - Keith Thompsonstring
类型。如果你的意思是 char *str = "How do I know?"
,那么 str
指向 'H'
。 如果你的意思是 char str[] = "How do I know?"
,那么 str
是一个数组;由于它是数组类型的表达式,在大多数情况下将被隐式转换为指向数组第一个元素的指针,也就是这里的 'H'
。请参阅 comp.lang.c FAQ。 - Keith Thompson我经常使用以NULL
结尾的int
、char*
、struct
等数组,而且我也在其他人的代码中看到了相同的解决方案。这是一个非常普遍的现象 :)
但是:至少在语言核心中没有针对NULL
结尾字符串的语言指令,尽管一些标准C库使用它(主要在<string.h>
中)。
char
数组。因此,并不是每个char
数组都以NUL结尾;你可能有一个不代表字符串的这样的数组。你可能有一个char
数组,其中包含嵌入式NUL字节,这些字节不表示终止符(因为该数组包含任意二进制数据,而不表示字符串)。main()
函数的argv
参数),有时使用NULL
作为哨兵值是合理的。
0
在ASCII编码方面是有意义的。因为它是“null char”的代码。另一种类型可以用于编码字符串。例如,wchar_t
将遵循相同的编码约定。int
很少用于保存字符串,因此什么值可以用作“null”?通常没有。特别不是0
,因为它可能是您想要存储在数组中的正常内容。 - v.oddouNULL
是一个宏,它会扩展为一个空指针常量。终止C字符串的空字符'\0'
不是同一件事情。 - Keith Thompson