前言
- 本篇博客的代码是在VC6.0++中实现;
- 一看博客标题好像是在说字符数组的,实际上在C语言中,字符型数组包括字符数组和字符串数组;
- 数组知识并不是很难的知识,但是一些细节问题需要注意,繁琐的概念问题不在过于强调,只强调一些易错易忽视的一些问题;
字符型数组包括字符数组和字符串数组
字符数组
概念:显然是由一些字符组成的数组;例如;
定义一个字符数组:一维数组:char 函数名[行 常量表达式] 例如:char ch[5];
二维数组:char 函数名[列 常量表达式] 例如:char ch[2][12]
注意:
由于字符和整型可以在0~127之间可以转换,int ch[10]也可以说是字符型,这个不建议使用,可以忽略这个知识点
初始化:
1. char ch[12] = {'I',' ','L','o','v','e',' ','Y','o','u'};
2. char ch[] = {'I',' ','L','o','v','e',' ','Y','o','u'};
3. char [2][12] = {{'I',' ','L','o','v','e',' ','Y','o','u'},{'I',' ','L','o','v','e',' ','C','h','i','h','a'}};
4. char [][12] = {{'I',' ','L','o','v','e',' ','Y','o','u'},{'I',' ','L','o','v','e',' ','Y','o','u'}}
注意:
- 初始化过程中,没有被初始化的数组项编译器会给默认赋值’\0’;(整数数组没有被初始化的数组项被赋值为0)。例如:char ch[5] = {‘a’,‘b’,‘c’,‘d’}; 中 ch[4] = ‘\0’;
- 在二维数组中,行可以不写,列不能不写;
3)
字符串数组
概念:字符数组的另外一种形式;字符之间直接连接;
定义一个字符串数组: 一维数组 char 变量名[行 常量表达式]; 二维数组 char 变量名[行 常量表达式][列 常量表达式];
初始化:
1. char str[11] = {"I Love you"};
2. char str[] = {"I Love you"};
3. char str[] = "I Love you";
4. char str[12] = "I Love you";
5. char str[2][14] = {{"I Love you"},{"I Love China"}};
6. char str[][14] = {{"I Love you"},{"I Love China"}};
注意:
1) 对于字符数组来说,要求常量表达式大于或等于数组内字符数;而对于字符串数组来说,常量表达式只能大于 字符串数组字符数,因为:编译器会为每个字符串末尾赋值一个字符串结束标志–>‘\0’,所以在对字符串数组初始化时,我们必须预先为结束标志腾出一个字符空间;
比较字符数组和字符串数组的初始化
char a[] = {"I Love you"};
char b[] = {'I',' ','L','o','v','e',' ','Y','o','u'};
char c[] = {'I',' ','L','o','v','e',' ','Y','o','u','\0'};
从数组类型来看:
a是字符串数组,系统会分配结束标志符号‘\0’;常量表达式必须比有效字符数大(至少1);
b和c都是字符数组,系统并不分配结束字符;c[10] == '\0’也是我们自己加的;
从数组项来看:
a和c虽然表达形式不同,一个字符数组,一个字符串数组;但是两个数组基本上可以划等号;数组长度,输出等一样,不仅可以用%s和%c他俩赋值,还可以用%s和%c输出;
b就是一个纯字符类型,不能用%s对其输入赋值,也不能用%s对其输出,否则将会出现错误;
总结一下:其实可以将字符串数组看成是字符数组的一种特殊表现形式;解决了字符数组输入困难,初始化困难,输出困难的弊端;
介绍两个函数
sizeof(对象)函数
功能:用来测量括号内对象占用的内存空间大小;
例子:(在VC6.0环境中)
int a;
double b;
char c;
char d[4] = {'L','o','v','e'};
char e[] = {"LOVE"};
sizeof(a); //a为整型,一个整形变量占用4个字节空间,sizeof函数返回值为4;
sizeof(b); //b为double型,一个整形变量占用8个字节空间,函数返回值也为8;
sizeof(c); //c为字符型,一个字符占用1个字符空间,函数返回值为1
sizeof(d); //字符数组d一共占用4*1个字符空间,函数返回值为4;
sizeof(e); //字符串数组e一共占用5*1个字符空间,函数返回值为5;
strlen(对象)函数
注意:这个函数并不像sizeof一样可以测量其他类型数据,只能用来测量字符串数组;
功能:用来测量字符串数组的有效长度(这里的长度指的是字节数);
例子:
char a[]={"LOVE"};
sizeof(a); //字符串a内一共有5个字符,但是有效字符是‘\0’之前的,也就是LOVE;所以函数返回值为4;
/*字符串数组中结束标识符'\0'的作用*/
char b[]={"LOVE\0LOVE"}; //b所指向的字符串确实是:LOVE\0LOVE\0
strlen(b); // strlen()在对字符串b进行扫描的时候,直到遇到结束标识符'\0'之前都是有效字符,之后的全部无效;所以strlen返回值为4;
sizeof(b); //对于字符串b来说所指向的字符串是完整的LOVE\0LOVE\0,占用的空间也是10*1==10;所以返回值为10;
其他
- 字符数组和字符串数组在仅仅定义不初始化的情况下是定义的方式是一样的;如果通过scanf对其进行赋值的时候,对这个数组输入字符类型的控制也就是%s或%c的不同决定了这个数组是字符串数组还是字符数组;这里还要注意字符串数组的技术标识符占用一个空间;