我们知道对于字符数组,我们使用'\ 0'标识其结尾,其他类型的数组呢?
我认为它不是特殊字符,例如'\ 0',因为要声明一个由n个元素组成的整数数组,例如,您只分配n * sizeof(int),但是对于字符数组,我们将其记为'\ 0 '。
答案 0 :(得分:3)
答案 1 :(得分:2)
字符数组只是类型为char[]
的数组。它没有任何东西可以标识它的结局。您所谈论的是一个 c-string ,它是一个以null终止的char数组。或更准确地说,是一个以零结尾的连续字符序列。从技术上讲,它不必是数组。
考虑以下代码:
char * p = malloc(20);
strcpy(p, "Hello, World!");
指针p
现在将指向一个非数组的c字符串。
char数组不需要以\0
结尾,但如果是,则为c字符串。
C标准7.1.1.1
字符串是一个连续的字符序列,以第一个空字符结尾并包含第一个空字符。术语“多字节字符串”有时用于代替强调字符串中包含的多字节字符的特殊处理,或者避免混乱与宽弦。指向字符串的指针是指向其初始(最低寻址)字符的指针。字符串的长度是空字符之前的字节数,而字符串的值依次是所包含字符的值的顺序。
因此,简而言之,数组根本没有终结符。甚至没有字符数组。最接近的是sizeof
,它将为您分配为数组分配的空间,但它的工作方式与null终止符不同。如果您已经动态分配了空间,或者正在使用指针访问数组,则甚至不能使用sizeof
。可以,但是不会获得所需的大小。
答案 2 :(得分:1)
字符串以空值终止的原因是为了方便。大量的存储过程都采用这种约定来处理字符串。
如果保持记录字符串的长度,则可以处理不带空终止符的字符串。以同样的方式,您需要记录数组的长度,除非您希望以定点值终止它们-但是不要期望任何现成的函数能够理解这一点。
答案 3 :(得分:0)
您可以在C语言中以不同的方式声明字符串(C语言中不存在实际的字符串类型):
char MyStr[5] = "Jack";
char * MyStr = "Jack";
char MyStr[5] = {'J','a', 'c', 'k', '\0'};
在情况1和2中,当编译器遇到“”时,它将在末尾附加一个空字符'\ 0'。 在最后一种情况下,您应该手动附加它(按照惯例,您使用'\ 0'),但要点是不要访问数组外部的元素。
示例:
while (*Mystr) /* Check against NULL char*/
{
/* Do something */
}
如果使用指向字符类型的指针,则声明后将无法再对其进行更改,因为它将存储在只读段中。