|
许多人理不清字符数组和字符指针及字符串之间的关系,其实编译器把它们分得很清楚。下面里仁嵌入式培训讲师详情分享:
字符数组就是元素为字符数量的数组,而字符串则是以‘\0’为结束字符的字符数组,可见,字符数组并不一定就是字符串。
字符数组就是元素为字符变量的数组,而字符串则是以‘\0’为结束字符的字符数组。可见,字符数组并一定就是字符串。
而对于字符串来说,它是变长的。因此它无法记录自己的长度,但是,如何来表示字符串的结束呢?它本身又没有长度信息,因此必须用一个字符来标记字符串的结束,这就是‘\0’的来历,由于字符串的连续性,编译器没有必要通过它的长度信息来提取整个字符串,仅通过一个指向其开头字符的字符指针就能实现整个字符串的引用。
如果用一个字符串字面常量来初始化一个字符数组,数组的长度至少要比字符串字面常量的长度大1,因为还要保存结束符‘\0’。例如:
Char array[]=“hello”
数组array的元素为{‘h’, ‘e’, ‘l’, ‘l’, ‘0’, ‘\0’,}
对于字符数组来说,它并不在乎中间或末尾有没有‘\0’结束字符,因为数组知道它自己有多少元素,况且‘\0’字符对它来说是个合法的元素,问题就在于:你可能会把字符数组当做字符串来使用,可能使用字符指针来引用一个字符数组,在这种情况下,用来操作字符串的库函数并不知道这个字符串是来自一个字符数组,因为传递进去的不仅仅是一个字符指针,而字符指针除了它的类型和值外并不包含其他任何信息,这些库函数总是假定你提供的字符指针指向的内存空间中的某个字节里面放着那么一个‘\0’,它们会很傻地直到找到第一个‘\0’字符时才会罢休。 |
|