C中的字符串或字符数组必须以null结尾,以知道它们的结尾。为什么同一规则不适用于其他类型的数组? 例如。计算机如何知道整数数组的结尾位置?整数/浮点数/双精度数组在内存中的表示方式有何不同?
答案 0 :(得分:2)
字符数组不必以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,是因为选择using a terminator seemed more convenient to them than maintaining character counts紧接着字符数组。
但是C语言中没有任何东西会强加这种偏爱。
答案 1 :(得分:1)
C中的字符串是char
的序列,该序列以null结尾。这是char
数组的特例。
您可以拥有一个char
数组,该数组不是为空终止。例如:
char x[] = { 'a', 'b', 'c' };
通常,数组表示为内存中基本类型的连续序列。该语言本身无法跟踪数组的大小,您应该自己完成操作。
答案 2 :(得分:1)
简短的回答:因为这就是C语言的定义。
更长的答案:C字符串本身没有什么特别的。就像其他任何块一样,它们是包含字节的内存块。但是,通过定义以0终止字符串的约定,所有函数都可以就处理字符串的方式达成共识。
它们的执行方式可能会迫使您分别处理长度,并始终为每个函数提供指针和长度。这很麻烦,所以最好只使用终结器。在连接等情况下,它也较慢,因为必须先查找结束位置。
关于为什么不将其与其他类型一起使用的情况,有时会使用。原因是相同的:它是作为约定达成的,并且与字符串相同。我们不知道有多少个值,所以最后我们有一个哨兵值。它可以为null,0或其他某个值。但是我们也不能做到这一点,并单独提供元素数量。
使用哨兵值通常也是不可能和/或不必要的,例如,如果我们需要整个数据类型或知道数据的大小。例如,如果我们有RGB图像,我们将如何定义最终值?我们需要字节必须具有的所有值来定义颜色,所以我们没有哨兵。我们也不需要一个,因为我们知道图像的大小。
对于计算机,它对数据一无所知。它只能处理字节和字,以及处理的所有内容。字符串的级别更高,并且完全在使用的语言的库中处理。处理器只是根据您的指示移动数据。例如,PC BIOS在打印字符串时使用$作为终止符,而不是0。
答案 3 :(得分:0)
您通常将数组的长度与指针一起传递。没有“知道”任何东西的长度。
内存就是内存。字节数组中可以包含0x42 0x41 0x44 0x00,这恰好是“ BAD”的字符串,但也可以是代表“ 1145127936”的整数或代表“ 773.0625”的浮点数