为什么char数组需要以NULL结尾?例如,为什么int数组不需要在末尾有分隔符?
答案 0 :(得分:7)
char[]
不必以NULL结尾。它是一种在使用char数组作为字符串时使用的约定。您可以将char []用于您自己的目的而不需要任何终止符。
答案 1 :(得分:6)
这是一个方便的问题。
ISO C标准的第7.1.1节以这种方式定义字符串:
string 是由and结尾的连续字符序列 包括第一个空字符。
有许多可能的方法来表示字符串,例如使用计数和数组,或计数和指针。对于字符串文字和处理字符串的标准库函数,空终止恰好是为C选择的方式。
这很方便,因为空字符并不真正用于其他任何东西。它不可打印,它不是具有某些已定义显示行为的控制字符,例如以某种特定方式移动光标。
你可以拥有几乎任何东西的数组,但是使用零值来标记序列结尾的约定对于其他类型来说并不方便。对于整数或浮点类型,零是一个有效值,您可能希望将其作为数组中的普通数据。
指针 do 具有可用于标记序列结尾的可分辨值:空指针NULL
。事实上它有时会以这种方式使用。 C程序的命令行参数作为指向字符串的指针序列传递;该序列的长度由终止空指针标记的argc
和的值表示。另请参阅类似Unix的系统上的environ
指针和exec*()
函数。
(但对于某些应用程序,空指针也可以是有效值,因此不能用作终结符。)
字符串操作是C语言和库的重要组成部分,因此有一个如何表示字符串的约定是有意义的。该约定不适用于其他类型的数组。
(顺便说一下,重要的是要记住NULL
是一个扩展为空指针常量的宏。使用名称NULL
来引用null <是不正确的em> character '\0'
。根据上下文,两者都可以在C源代码中表示为常量0
,但它们是完全不同的东西。)
答案 2 :(得分:0)
您不需要将C
char[]
空终止,而是string
。因为在C
中string
表示空终止的字符数组和\0
null终结符,这会告诉库该字符串在哪里结束。
<强>为什么吗
因为最初C
作为具有低抽象的基本语言没有string
作为数据类型string
中的C
只是{{1}的集合}}
为了使它更清晰,技术上是NO数据类型称为char
,它只是一个为程序员可访问性实现的外观,使其成为一个高级概念,通常使用{{1的基本数据类型实现}}
答案 3 :(得分:0)
我使用NULL
- 已终止int
,char*
,struct
等阵列很多次,我在其他代码中也看到了相同的解决方案。这是一种非常普遍的现象:)
但是:NULL
终止字符串没有语言指令,至少在语言核心中没有,尽管一些标准C lib使用它(主要在<string.h>
中)
答案 4 :(得分:0)
在C中,字符串的概念表示为NUL终止的数组{ - 1}}。因此,并非每个char
数组都是NUL终止的;你可以拥有一个不代表字符串的数组。您可以拥有一个char
数组,其中包含 not 表示终结符的NUL字节(因为该数组包含任意二进制数据且不代表字符串)。
您通常不会看到其他数组类型的终结符(sentinel值),因为通常情况下,您会使用什么值? sentinel值必须是不会用于数组的其他元素的值。你确实看到了一些特殊情况的哨兵价值;例如,使用char
作为指针数组的标记值(例如NULL
argv
参数)有时是合理的。
至于为什么C字符串完全是NUL终止的(而不是Pascal样式的字符串),这是语言作者选择的设计。两种方法都存在权衡。另请参阅What's the rationale for null terminated strings?
答案 5 :(得分:-1)
在int数组中,数组元素永远不会一起用作字符串。但是,这是char数组的情况。通过使用null终止字符数组,您将能够将其用作字符串。