C语言没有字符串类型
字符串常量(字符串字面量)指由位于一对双引号的任何字符,编译器自动为其提供结束标志。如果字符串字面量中间没有间隔或者间隔是空格符,它们将会被串联起来。
"he" "llo, " "world" // 等价于
"hello, world"
字符串数组是指以空字符('\0')结尾的字符型数组,字符串数组可以直接使用字符串字面量初始化;也可以逐字符初始化。采用标准数组初始化方式时,需要显示追加结束标志符,否则得到的就是一个字符数组而非字符串。定义一个字符串数组时,必须让编译器知道它需要多大空间,一种方法是指定足够大的空间以容纳整个字符串。
char str[200] = {'s', 't', 'r', '\0'};
char txt[200] = {'s', 't', 'r'}; // 正确:但txt不是字符串!
char msg[20] = "glimix.com";
char foo[32 + 32] = "foo" "bar" "..."; // 正确:两个字面量相加是常量,可用于指定数组大小
也可以选择最适合的大小,这个最小空间需要确保比字符串长度至少多1个字符以便容纳空字符。
char str2[6] = "hello"; // 正确:空间正合适
char str3[5] = "hello"; // 错误:空间太小放不下'\0'
通过省略维度信息,就可以让编译器决定数组的大小。
char s1[] = "hello, world";
char s3[] = { 'h', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l','d', '\0' };
我们也可以通过指针符号建立字符串,此时字符串是只读的。
const char *s = "hello, world";
s[0] = 'H'; // 错误
但是,通过字面量初始化字符串指针与数组这两种表达,本质上有很大的区别。
const char *s1 = "balabala...";
const char s2[] = "balabala...";
- 初始化字符串指针时,该指针仅仅是持有字面量的起始地址。
- 初始化为数组形式时,该字面量的将会被拷贝到数组空间中。
字符串字面量整个引号中的内容作为指向该字符串存储位置的指针。同一个字符串字面量,在程序的整个运行过程中仅有一份存储,而指针形式都是指向这个字面量的起始地址,所以这些指针的值是相同的。
#include <stdio.h>
void foo()
{
const char *str = "balabala...";
printf("foo: 0x%p\n", str);
}
void bar()
{
char str[] = "balabala...";
const char str2[] = "balabala...";
printf("\n");
printf("bar: 0x%p\n", str);
printf("bar: 0x%p\n", str2);
}
const char *global = "balabala...";
int main()
{
const char *str = "balabala...";
printf("literal: 0x%p\n", "balabala...");
printf("global: 0x%p\n", global);
printf("main: 0x%p\n", str);
foo();
bar();
return 0;
}

回到主题本身,你会发现C语言中并没有提供一个字符串类型(string)来表达字符串本身,而是间接的使用字符数组来个表达这个概念,所以说,C语言并没有内建的字符串类型!
const string s3 = "balabala..."; // 错误:C语言没有内建的string类型