之前学习C语言都是为了蒙混考试从来没有认真去学习过,现在大三了有了想为之奋斗的人所以也就慢慢地在提升自己的专业技能,开始把以前半懂不懂的知识进行梳理。所以这篇博客是关于字符串和一维字符型标题数组的。大家可浅浅读一读,如果有错误欢迎指出哈哈哈哈
C语言中规定字符串是以双引号括起来的一串字符,如"a"
是一个字符串,"you are beautiful"
也是一个字符串,并且我们将其称为字符串常量
字符串的存储方式
在C语言中字符串常量会被隐含处理成一个以’\0’结尾的无名字符型一维数组,(这是区别一维字符型数组和字符串的标准,以串结束符’\0’结尾的一维字符数组可以视为字符串处理,否则不可。这就是本篇的精华)这个“无名字符型一维数组”就是一个没有正式名字的数组,C编译器会以字符串常量的形式给出每一个字符串的存储空间首地址。(我们可以理解成C编译器把字符串常量看成了一个地址)看如下代码理解
char *sp,str[10];
//字符串常量在赋值过程中给出的是这个字符串在内存中所占的一串连续存储单元的首地址
str="Hello!";//不合法赋值,str是数组的首地址具有不可变性
sp="Hello!"//合法赋值,因为sp是指针变量,其内部存的是一个地址值
细说区别
字符数组可以有一维二维三维等,但只有一维字符数组在以串结束符’\0’结尾时可以当成字符串处理,否则可能出现异常情况。我们把可以当成字符串处理的一维字符型数组称为字符串变量
字符数组的赋值方式一
声明长度
char str[10]={'s','t','r','i','n','g'};
char str[10]={'s','t','r','i','n','g','\0'};//等效
在内存的存储方式。字符个数为6小于10,编译器自动以’\0’填充满剩余空间。此时的数组可当成字符串处理,其长度为6。
s | t | r | i | n | g | \0 | \0 | \0 | \0 |
---|
char str[6]={'s','t','r','i','n','g'};
字符个数为6等于声明的数组长度6,不会自动填充’\0’,所以数组没有以’\0’结尾故不可当成字符串处理。
s | t | r | i | n | g |
---|
不声明长度
char str[]={'s','t','r','i','n','g'};
这就是一个有6个元素的字符数组(编译器识别字符个数为6从而确定数组大小为6),因为没有以’\0’结尾故不可当成字符串处理。
char str[]={'s','t','r','i','n','g','\0'};
这就是一个有7个元素的字符数组(编译器识别字符个数为7从而确定数组大小为7),因为以’\0’结尾故可当成字符串处理。
字符数组的赋值方式二
以字符串常量给一维字符数组赋值(这种情况编译器直接将数组视为字符串的存储数组,也就是说该数组可以视为字符串处理)
声明长度
char str[10] = {"string"};
//常写成
char str[10] = "string";
因为"string"长度为6数组有剩余空间,系统自动添加’\0’。
char str[6] = "string";
此时数组没有剩余空间,系统将使用下一个不属于数组的存储单元添加’\0’。这种情况可能得到正确答案,也可能得不到。
不声明长度
char str[] = "string";
系统按字符串实际字符个数定义数组大小,在次数组包含7个元素(含系统自动添加的’\0’)
来看看一些错误赋值实例
想一想为什么错误!!!
char sh[20];
sh = "UGLY! UGLY! UGLY!";//不合法
char sh[20] = "UGLY! UGLY! UGLY!",ch[20];
ch = sh; //不合法
数组名是常量,不可赋值!!!