如果字符串数组在C中以null结尾,为什么其他数据类型的数组不以null结尾?

如果字符串数组在C中以null结尾,为什么其他数据类型的数组不以null结尾?,c,arrays,string,C,Arrays,String,C中的字符串或字符数组必须以null结尾才能知道它们的结尾。为什么相同的规则不适用于其他类型的数组? 计算机如何知道整数数组的终点?在内存中表示整数/浮点/双精度数组的方式是否有差异?C中的字符串是以null结尾的字符序列。这是char数组的特例 您可以有一个非空终止的char数组。例如: char x[] = { 'a', 'b', 'c' }; 数组通常表示为内存中基类型的连续序列。语言本身不跟踪数组的大小,您需要自己跟踪。您通常将数组的长度与指针一起传递。没有人“知道”任何事物的长度 记

C中的字符串或字符数组必须以null结尾才能知道它们的结尾。为什么相同的规则不适用于其他类型的数组?
计算机如何知道整数数组的终点?在内存中表示整数/浮点/双精度数组的方式是否有差异?

C中的字符串是以null结尾的
字符序列。这是
char
数组的特例

您可以有一个非空终止的
char
数组。例如:

char x[] = { 'a', 'b', 'c' };

数组通常表示为内存中基类型的连续序列。语言本身不跟踪数组的大小,您需要自己跟踪。

您通常将数组的长度与指针一起传递。没有人“知道”任何事物的长度


记忆就是记忆。字节数组中可以有0x42 0x41 0x44 0x00,这恰好是“BAD”的字符串,但也可以是表示“1145127936”的整数或表示“773.0625”的浮点。简短回答:因为C语言就是这样定义的

更详细的回答:C字符串本身并没有什么特别之处。它们是一个包含字节的内存块,就像其他块一样。但是通过定义以0终止字符串的约定,所有函数都可以在处理字符串的方法上达成一致

它们可以强制您单独处理长度,并始终为每个函数提供指针和长度。这很麻烦,所以最好只使用终结者。在连接之类的情况下,它的速度也较慢,因为首先必须查找结束位置

至于为什么它不与其他类型一起使用,它有时是。原因是一样的:它是作为一种惯例,以与字符串相同的方式商定的。我们不知道有多少个值,所以最后我们有一个哨兵值。它可以是null、0或其他值。但我们也不能单独提供元素的数量

使用sentinel值通常也是不可能和/或不必要的,例如,如果我们需要整个数据类型或知道数据的大小。例如,如果我们有一个RGB图像,我们将如何定义一个结束值?我们需要所有的字节值来定义颜色,这样我们就不能有一个哨兵。我们也不需要,因为我们知道图像的大小


至于计算机,它对数据一无所知。它只能处理字节和单词,以及它构建来处理的任何内容。字符串的级别更高,完全在所用语言的库中处理。处理器只是根据您告诉它的操作来移动数据。例如,PC BIOS在打印字符串时使用$作为终止符,而不是0。

字符数组不必以nul结尾

char foo[3]="foo"; //not nul-terminated
char bar[]={'b','a','r'}; //not nul-terminated
只是字符串文字是以nul结尾的数组,而C通过使用字符串文字作为初始值设定项使以nul结尾的数组变得非常容易:

 char baz[]="baz"; //nul-terminated because "baz" is
为什么C会这样做是设计者的选择,因为接下来是字符数组


但是在C语言中,没有任何东西会强迫你这样做。

C字符串和“字符数组”不是一回事。字符数组不需要以0结尾。
为什么相同的规则不适用于其他类型的数组?
-它确实适用。有些库需要空/零/一些额外的字符数据。在我的脑海中,ex.使用了一个以
{0,0,0}
结尾的数组。碰巧“字符串”是由C标准定义的,C标准库支持它们。@KamilCuk为什么还要到第三方库呢?
main
中的
argv
已经以空指针终止:)“其他数据类型”可以包含多个零,这些零是这些类型的合法成员。因此,零不能是有效的数组结束标记。这是一个很好的示例-带有
argv
argc
可能是这两种方法的一个示例-您在
argc
中有计数,但
argv
仍然以null结尾。这只是一个惯例。string literal和string是相似的,但不同于C语言。字符串和字符数组问题的答案与字符串文字更为复杂。