1.基本概念
C语言没有独立的字符串类型,字符串被当作字符数组处理。但在处理字符串时,在字符串最后一个字符后边会自动添加一个全是二进制 0 的字节,写作 "\0" 字符,表示字符串结束。所有字符串的最后一个字符,都是 "\0" 。这样不需知道字符串的长度,就可以读取内存里面的字符串,一旦读到字符 "\0" 则字符串结束。也由此,声明的字符串长度与实际能存放的字符串长度差一个,即 "\0" 。
正因为字符串是字符数组,所以有关数组的操作对于字符串同样适用。
字符串数组赋初值可以写成大括号内单引号引着的一个个字符。这样写是太麻烦,实际中的字符串赋初值是用一对双引号把连续字符引起来;它与字符数组等价,但形式简单。例如:
char myStr[] = "Hello World!"; //强调:这种写法只能是在字符数组声明时赋初值
上面声明的字符串,名:myStr 长度:13(包含空格、结尾"\0")。这个 "\0" 一定要牢记,比如:char a='1'; 与char a[] = "1"; 这两者一个是双引号一个是单引号,区别就在 "\0"上,"1"不但有1还有 "\0",而'1'只有1。
如果字符串中,本身就包含双引号怎么办呢?给双引号前边加上一个反斜杠(称为转义符)即\",就把双引号加到字符串中了。
上面的举例如写成:myStr[]="Hello ""World";(即连续的几对双引号都赋给一个字符串)也是符合语法的,不会报错。
在printf函数中输出字符串:常量直接输出,变量用%s占位符输出。
2.字符串变量的声明
字符串变量可以按字符数组形式声明,也可以用指向字符数组的指针形式进行声明。
char myStr[1024] = "C语言从头学"; //声明长度1024字节实际使用不了会初始化成 "\0"
//如果不写具体长度只写空的[ ],计算机会自己计算所需要的长度
char* myStr = "C语言从头学";
上面的声明形式上差不多,但还是有差异,表现在:
a.字符数组声明的字符串变量可以一个一个字符进行修改,但不能重新赋值;
char a[]="1134"; a[0]='0'; a[1]='2'; //合乎语法
但如果:a[]="4311"; //会报错
b.指针方式声明的字符串变量可以重新赋值,但不能单个字符进行修改;
char* b="1111"; b="2222"; //合乎语法
但如果:b[0]='2'; //可能报错或出现错误运算结果
3.说明:单独字符能不能修改的原因:为什么字符串声明为指针时不能单独字符修改,声明为数组时就可以修改?原因是声明为指针时,字符串是一个保存在内存“栈区”的常量,“栈区”的值由系统管理,一般都不允许修改;声明为数组时,字符串的副本会被拷贝到内存“堆区”,“堆区”的值由用户管理,是可以修改的。整个字符串能不能修改原因:以指针形式声明的字符串变量,因为其是变量故可以指向其它的字符串;而字符数组变量虽称作变量但不能指向另一个字符串,因为字符数组的数组名总是指向初始化时的地址,不能修改。