字符串(character string)是一个或多个字符的序列,如下所示:
"Zing went the strings of my heart!"
双引号不是字符串的一部分。双引号仅告知编译器它括起来的是字符串,正如单引号用于标识单个字符一样。
字符串字面量
字符串字面量是用一对双引号括起来的字符序列,字符串字面量常常作为格式串出现在printf函数和scanf函数中。
字符串字面量可以包含转义序列(比如\n等),假如有如下字符串使用printf函数输出:
pintf("Candy\nIs dandy\nBut liquor\nIs quicker.\n --Ogden Nash");
输出结果:
Candy
Is dandy
But liquor
Is quicker.
--Ogden Nash
可以看出字符串中每个字符\n都会导致光标下移到下一行。
存储字符串字面量
从本质而言,C语言把字符串字面量,作为字符数组来处理。当C语言编译器遇见长度为n的字符串字面量时,它会会字符串字面量分配长度为 n + 1 的内存空间。这块内存空间将用来存储字符串字面量中的字符,以及一个用来标志字符串末尾 的额外字符(空字符)。空字符用转义序列 \0 表示。
例如:字符串字面量"abc",瞅着是3个,实际上是作为4个字符的数组存储的(’a‘、’b‘、’c‘、’\0‘),如下表所示
| 数组下标 | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| 数组中数据 | ’a‘ | ’b‘ | ’c‘ | ’/0‘ |
而且,编译器会把字符串字面量看作是 char * 类型的指针。
例如printf函数和scanf函数都接收 char * 类型作为他们的第一个参数,比如:
printf("abc");
//当调用printf函数时,会传递"abc"的地址,也就是传递的其实是,指向存储字符'a'的内存单元的指针。(因为'a'的地址是首地址嘛)
字符串字面量的操作
字符串字面量可以用字符串字面量给 char * 指针赋值
char * p;
p = "abc";
这个赋值操作不是赋值"abc"中的字符,而是使指针 p 指向字符串的第一个字符。p 中存储字符a的地址。
C语言允许对指针取下标,因此可以对字符串字面量取下标,代码如下:
char ch;
ch = "abc"[1];
ch 被赋值的则是 字符'b'。如果下标是 0 (将赋值 'a' ),如果是3(将赋值空字符'\0'),不过这种用法并不常用。
字符串变量
字符串变量声明以及初始化
char date[8] = "June 14";
编译器把字符串"June 14" 中的字符复制到数组date中,然后追加一个空字符(’\0‘)作为字符串使用:
| 数组下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| 数据 | 'J' | 'u' | 'n' | 'e' | ' ' | '1' | '4' | '\0' |