10.1 字符串文字量

字符串处理是应用程序中经常要遇到的问题,比如在处理程序的输入、输出时,字符串处理几乎无法避免。此外在字处理、编译程序等软件中,字符或字符串处理也占有相当大的比重。

C语言本身没有字符串这种数据类型,但因为指针的存在,对字符串的处理非常得心应手。

1.定义

字符串文字量(String literals)是在代码中直接写出的若干连续字符所构成的一个字符序列,在本书中的某些地方称之为“裸串”。

在代码中,书写赤裸裸的字符串时,需要用""把字符序列括起来(可以为空),以向编译器表示这是一个字符串文字量而不是标识符或其他的单词,如:

10.1 字符串文字量 - 图1

1 区别于ABC(标识符)和OXABC中的ABC。

字符串文字量没有统一的长度。编译时,字符串文字量中字符序列的尾部被编译器加上一个值为0的字符'\0',并按照数组的存储方式存储。如前面的字符串"ABC",在内存中被存储为如图10-1所示的样子。

10.1 字符串文字量 - 图2

图10-1 字符串文字量的存储

'\0'字符用来表示字符串的结束。'\0'字符的名字一般被叫做null character,也可以说'\0'是一个空的字符。

在字符串文字量内部,“"”这样无法直接写出的字符可以用转义序列“\"”来写。其他的字符常量也可以用别的方式来写。如:

10.1 字符串文字量 - 图3

是由""、'\x12'、'\n'、'\7'这4个字符构成的字符串文字量。

2.性质

字符串文字量可以视同为一字符数组。比如前面的"ABC"就可以视为“char [4]”类型的数据。

“char [4]”类型的数据作为左值时表示所占据的内存,作为右值时表示“char*”类型的指针,下面的代码可以证实这点。

程序代码10-1

10.1 字符串文字量 - 图4

运行结果如图10-2所示。

10.1 字符串文字量 - 图5

图10-2 字符串文字量

这个结果表明,"ABC"的类型为“char [4]”。当然,得到这个结果的前提是,代码中出现的3个"ABC"是同一个字符串文字量,这通常是编译器的一个编译选项。也就是说可以选择把它们编译为同一个,也可以不这样选择。

由于字符串文字量的值是“char *”类型的指针,因此下面的表达式是完全合法的。

10.1 字符串文字量 - 图6

它们分别表示指向字符序列中字符'B'的指针,字符'C',以及字符'B'。

字符串文字量同样可以直接对同类型的指针变量赋值。如:

10.1 字符串文字量 - 图7

但是只可以通过“p”读出"abc"中的字符,修改其中的字符是未定义的行为。C语言规定,修改字符串文字量中的字符是一种未定义行为(Undefined Behavior),换句话说,在代码中不容许试图修改字符串文字量中的各个字符(1)

“p”这种指向字符串中某个字符的指针往往被俗称为“指向字符串的指针”,但实际上指向字符串的指针是不存在的(因为字符串的长度各异),本质上所谓的“指向字符串的指针”是指向字符的指针。为了叙述的方便,本书间或使用“指向字符串的指针”这种说法,但一定要清楚,本质上这是指向字符的指针。

可以调用printf()函数输出字符串文字量,输出格式为“%s”,“%s”要求与之对应的参量应该是“char *”类型。下面是一个示意性的例子。

程序代码10-2

10.1 字符串文字量 - 图8

程序输出如图10-3所示。

10.1 字符串文字量 - 图9

图10-3 调用prinf()函数输出字符串文字量

这段代码的主要用意是表明字符串文字量的右值是一个“char *”类型的指针。

此外还要说明一点,两个相邻的字符串字面量在编译时会被合成为一个。如:

10.1 字符串文字量 - 图10

等同于"ABCDEFG"。如前面出现过的那样,这一点可以被利用来改善代码的可读性。

练习

1.输出一个字符串文字量第2个字符之后的所有字符。

2.3["abcd"]这样的表达式一般不会出现在代码之中,然而这的确是个有明确含义的合法的C语言表达式,试问这个表达式是什么类型,值为多少?