C 字符串
C 语言不存在字符串类型,不过C语言提供了字符串常量。事实上,C语言存在字符串的概念:它就是以NUL字节结尾零个或者多个字符。
字符串通常存在于字符数组中,这也是C语言没有显示的字符串类型的原因。由于NUL字节是用于终结字符串的(NUL不是一个可打印的字符),所以在字符串内部不能有NUL字节。不过,在一般情况下,这个限制不会造成问题。
- 字符串常量的书写方式是一对双引号包围一串字符,如: "Hello", "\aWarning!\a", "Line 1\nLine 2 ", ""
最后一个例子说明字符串常量可以是空的(不像字符常量)
- 字符串赋值 有2种方式
// 指向char型的常量指针 char *s = "hello"; //位于全局静态区,只读,编译时就确定了 printf("%p\n", s); // 字符数组 char s1[6] = "world"; // <==> char s1[6] = {'w', 'o', 'r', 'l', 'd', '\0'}; printf("%p\n", s1); //位于栈区,可修改,运行时确定
char s[6]; s = "hello"; // 这样是错误的,原因就是不能把字符串常量赋值给字符数组
- 字符串修改
- K&R C:
在字符串存储形式中,所有的字符和NUL终止符都存储在内存中某个位置。K&R C 中并没有提及一个字符串常量中的字符是否可以被程序修改,但清楚地表明具有相同值的不同字符串常量在内存中是分开存储的。因此,许多编译器都是允许程序修改字符串常量。 - ANSI C 则声明如果对一个字符串常量进行修改,其效果是未定义的。它也允许编译器把一个字符串常量存储于一个地方,即使它在程序中多次出现。这就使修改字符串常量极其危险,因为对一个常量进行修改可能殃及程序中其他其他字符串常量。因此,许多ANSI C 编译器不允许修改字符串常量,或者提供编译时选项,让你自行选择是否允许修改字符串常量。在实践中,尽量避免这样做。如果你需要修改字符串,请把它存储在数组中。
- K&R C:
- 字符串复制
C语言中字符串复制必须strcpy函数实现, 但是在C++ 使用string类 ,上面的赋值操作是正确的。char s[6] = "hello"; char ss[6]; ss = s; // C中 这样也是错误的
- 字符串常量和指针
字符串常量会生成一个"指向字符的常量指针"。 当一个字符串常量出现在一个表达式中,表达式使用的值是字符串常量所存储的地址,而不是字符本身。
char *p = "hello"; printf("%p\n", s); // 0x7ffceaac8f43 printf("%p\n", s+1); // 0x7ffceaac8f44
-
strlen VS sizeof
char s[] = "hello"; printf("strlen: %d\n", strlen(s)); // 5 printf("sizeof: %d\n", sizeof(s)); // 6 char ss[10] = "hello"; printf("strlen: %d\n", strlen(ss)); // 5 printf("sizeof: %d\n", sizeof(ss)); // 10
最后,附上参考链接
- Kenneth A.Reek .《C和指针》
-
C语言中定义字符串的两种方式及其比较
浙公网安备 33010602011771号