字符串常量的定义与引用
周立功教授数年之心血之作《程序设计与数据结构》
第一章为程序设计基础,本文为1.8.2 字符串常量。
>>>>
1.8.2 字符串常量
字符的真正价值在于你可以将它们串在一起形成一个字符序列,即字符串常量,简称字符串。字符串常量就是使用一对双引号""""包围起来的,以空字符NUL(null character,NUL表示为'\0',ASCII码值为0x00)结尾的连续的字符串,其长度为字符串的长度加1。既然使用空字符结束字符串,那么printf()和strcpy()都将这一点作为默认的前置条件。
注意,NULL和NUL是不同的,NULL表示特殊的指针,通常定义为((void *)0),而NUL是一个char,定义为\0,两者不能混用。虽然字符常量是由单引号引起来的字符序列,通常由一个字符组成,但也可以包含多个字符,比如,转义字符,在C中它们的类型是int:
printf("%d\n", sizeof(char));
printf("%d\n", sizeof('a'));
执行上述代码可以看到char的长度为1,而字符常量的长度为4。
只要在程序中使用字符串,就必须确定如何声明保存字符串的变量。如果将它声明为数组,则编译时就已经为各个字符保留了内存空间;如果将它声明为指针,则编译时完全没有为字符分配任何内存,仅在运行时分配空间。比如:
char cStr[4] = "OK!";
char *pcStr = "OK!";
两者的区别是,数组名cStr是常量,而指针名pcStr是变量。注意,如果在初始化指针之前就使用指针,有可能会导致运行出错,如果有以下定义:
char *pcStr;
printf("%s", *pcStr);
由于这里没有对pcStr初始化,因此其指向的内存是未知的,将会打印出奇怪的字符,于是pcStr自然也就成为了野指针。
>>> 1. 字符串的引用
由于"OK!"是一个字符串常量,因此是不可修改的。如果试图执行以下操作:
pcStr[2] = 'Z';
虽然编译期可以通过,但在运行时会出错。如果以下面这样的形式赋值:
char cStr[4];
cStr = "OK!";
则是非法的,因为数组变量名cStr是一个不可修改的常量指针。
如果字符数组中没有保存'\0'',它仅仅是字符常量'O'、'K'、'!',不是字符串。即:
char cStr[] = { 'O', 'K', '!'};
而"char cStr[] = "OK!";"只不过是"char cStr[] = {'O', 'K', '!', '\0'};"的另一种写法,因为字符串是一种特殊的字符数组变量,所以其存储方式与数组变量一致。其中的cStr为数组变量名,表示此数组第0个元素的地址(即&cStr[0]),cStr+1表示数组第1个元素的地址(即&cStr[1]),cStr+2表示数组变量第2个元素的地址(即&cStr[2]),cStr+3表示数组变量第3个元素的地址(即&cStr[3]),其存储形式详见图1.13。
图1.13 "OK!"的存储形式
C语言中的字符串是以字符数组变量的形式处理的,具有数组的属性,所以不能赋值给整个字符数组变量,只能将字符逐个赋给字符数组变量。比如:
char cStr[4];
cStr[0] = 'O'; cStr[1] = 'K'; cStr[2] = '!'; cStr[3] = '\0';
其存储的不是字符本身,而是以ASCII码存储的字符常量(即存值)。
惯用法
由于字符串常量以'\0'(ASCII码值为0x00)结尾,因此可以用cStr[i]作为for循环语句的"条件部分(布尔表达式)",检查cStr[i]是否为'\0'(cStr[i]是以*(cStr+i)形式表示的)。用于处理字符串中每一个字符的惯用法如下:
for(i = 0; cStr[i] != '\0'; i++) …
其等价于
for(i = 0; cStr[i]; i++) …
同理"while(cStr[i] != '
字符串 相关文章:
- 字符串的输入输出及相关函数(08-14)