字符串是由若干字符组成的序列。由于字符串在编程时使用的频率非常高,为了优化,很多语言都对字符串做了特殊的规定。下面分别讨论C/C++字符串的特性。
C/C++中每个字符串都以字符"0作为结尾,这样我们就能很方便地找到字符串的最后尾部。但由于这个特点,每个字符串中都有一个额外字符的开销,稍不留神就会造成字符串的越界。比如下面的代码:
char str[10]="";
strcpy(str,"0123456789")
我们先声明一个长度为10的字符数组,然后把字符串"0123456789"复制到数组中。
"0123456789"这个字符串看起来只有10个字符,但实际上它的末尾还有一个"0字符,因此它的实
际长度为11字节。要正确地复制该字符串,至少需要一个长度为11字节的数组。
一个面试题:
请你分析一下的代打:输出的结果是什么
int main()
{char str1[] = "hello world";char str2[] = "hello world";if (str1 == str2)printf("str1 and str2 are same\n");elseprintf("str1 and str2 are not the same\n");const char* str3 = "hello world";const char* str4 = "hello world";if (str3 == str4)printf("str3 and str4 are same\n");elseprintf("str3 and str4 are not the same\n");return 0;
}
运行结果:
字符串1和2不相等,字符串3和4是相等的。
分析:
为了节省内存,C / C++把常量字符串放到单独的一个内存区域。当几个指针赋值给相同的常量字符串时,它们实际上会指向相同的内存地址。但用常量内存初始化数组,情况却有所不同。str1和str2是两个字符串数组,我们会为它们分配两个长度为12字节的空间,并把"hello world"的内容分别复制到数组中去。这是两个初始地址不同的数组,因此 str1和 str2 的值也不相同,所以输出的第一行是"strl andstr2 are not same"str3和str4是两个指针, 我们无须为它们分配内存以存储字符串的内容而只需要把它们指向"hello world"在内存中的地址就可以了。由于"helloworld"是常量字符串,它在内存中只有一个拷贝,因此str3和str4 指向的是同一个地址。所以比较str3和str4的值得到的结果是相同的,输出的第二行是"str3 and str4 are same"。
本篇完!