我们知道对于字符数组,有'\0'来标识其结尾,那其他类型的数组呢?
我猜测它不是像'\0'这样的特殊字符,因为例如声明一个n个整数元素的整数数组时,只需分配n * sizeof(int)的空间,但对于字符数组,我们需要考虑'\0'。
字符数组就是一个类型为char[]
的数组。它没有任何标识它结尾的东西。你所说的是字符串,它是以null结尾的char数组。更准确地说,它是以null结尾的连续字符序列。从技术上讲,它不需要是一个数组。
考虑这段代码:
char * p = malloc(20);
strcpy(p, "Hello, World!");
指针p
现在将指向一个不是数组的C字符串。
char数组不需要以\0
结尾,但如果是,它就是一个C字符串。
C标准7.1.1.1
字符串是以包括第一个空字符在内的连续字符序列终止的。有时会使用多字节字符串这个术语来强调对字符串中包含的多字节字符的特殊处理或避免与宽字符串混淆。指向字符串的指针是指向其初始(地址最低)字符的指针。字符串的长度是空字符之前的字节数,字符串的值是包含的字符值的序列,按顺序排列。
因此,简而言之,数组根本没有终止符,即使是字符数组也没有。最接近的是sizeof
,它将给出分配给数组的空间,但它不能像空终止符一样使用。如果您动态分配了空间或正在使用指针访问数组,则甚至不能使用sizeof
。好吧,你可以使用,但你得不到你想要的大小。
char MyStr[5] = "Jack";
char * MyStr = "Jack";
char MyStr[5] = {'J','a', 'c', 'k', '\0'};
while (*Mystr) /* Check against NULL char*/
{
/* Do something */
}
\0
字符(也称为空终止符,因为其ASCII值为0)只是用于打印函数知道何时停止打印字符串。 - SomethingSomething'\0'
是区分数组和字符串的关键。 - Weather Vane