在C语言中,字符串或字符数组必须以null结尾,以便知道它们何时结束。为什么其他类型的数组不遵循同样的规则呢?例如,计算机如何知道整数数组何时结束?在内存中表示整数/浮点数/双精度浮点数数组是否有区别?
字符数组不一定需要以空字符结尾。
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语言并没有强制要求你遵循这种偏好。
char
字符组成,并以空字符结尾。它是char
数组的一个特例。char
数组是没有以空字符结尾的。例如:char x[] = { 'a', 'b', 'c' };
有时使用哨兵值是不可能的或不必要的,例如我们需要整个数据类型或知道数据的大小。例如,如果我们有一张RGB图像,我们如何定义结束值?我们需要所有字节可以有的值来定义颜色,因此我们不能有一个哨兵值。我们也不需要一个,因为我们知道图像的大小。
至于计算机,它对数据一无所知。它只能处理字节和单词以及它被构建来处理的任何东西。字符串在更高级别上进行处理,并完全在所使用的语言库中处理。处理器仅根据您告诉它要执行的操作移动数据。例如,PC BIOS在打印字符串时使用$作为终止字符,而不是0。
{0,0,0,0}
结尾的数组。只是恰好“字符串”由 C 标准定义,并且 C 标准库支持它们。 - KamilCukmain
中的argv
已经是以空指针结尾的了 :) - Ruslanargc
和argv
结合在一起可能是两种方法的例子 - 你可以在argc
中得到数量,而且argv
仍然以null结尾。这只是一种惯例。根据使用情况使用最佳方法。 - KamilCuk