专题10 字符数组的定义及引用(讲义)-山东省(春季高考)软件与应用技术类《C语言程序设计知识》考纲讲练测
编写说明:本专辑为山东省(春季高考)软件与应用技术类《C语言程序设计知识考纲讲练测》,严格依据山东省春季高考软件与应用技术类专业考试大纲(C语言程序设计部分)编写,精准对标考纲,兼顾考点覆盖与实战应用。每套讲练测提供讲义、课件、练习三大配套教学文件,贯穿九大核心环节:考点解读、思维导图、知识梳理、背诵环节、常考题、模拟题、课堂练习、课堂小结及课后测验,形成“讲-练-测-评”闭环式教学与复习逻辑,助力考生夯实基础、突破重难点。
山东省软件与应用技术类
《C语言程序设计知识考纲讲练测》
专题10 字符数组的定义及引用 讲义
[考点解读]
1.掌握字符数组的定义及引用。
[思维导图]
[知识梳理]
1.字符数组的定义与存储
(1)前面用一维、二维数组存放的都是数值,实际问题里还有大量“文字”要处理。C 语言没有专门的字符串类型,字符串是用字符数组来存放的——教材 5.3 节开篇就写明:字符数组即数组元素为字符类型的数组,字符数组可以存放字符串数据。所以字符数组既是数组的一种,也是 C 语言处理字符串的唯一手段。
(2)定义形式与一维数组完全相同,只是元素类型写成 char:char 数组名[常量表达式];。例如 char s[6];
学科网(北京)股份有限公司
学科网(北京)股份有限公司
char s1[10]; char name[20];,方括号里的常量表达式表示数组长度,必须是常量表达式、不能含变量。char s[6]; 定义了 s[0]~s[5] 共 6 个元素,下标从 0 开始、最大下标是 5。每个元素存放一个字符,也可以赋 ASCII 码值(s[1]=66; 存入的是字符 B),char 每个元素占 1 个字节,所以元素个数与占用字节数相等。
表10-1 字符数组定义语句的组成
组成部分 | 示例 | 含义与要求 |
类型说明符 | char | 字符数组的元素类型只能是 char,每个元素占 1 个字节 |
数组名 | s、str、name | 命名规则与变量名相同,须遵循标识符命名规则 |
常量表达式 | 6、10、20 | 数组长度,即最多能容纳多少个字符,必须是常量表达式 |
分号 | ; | 定义语句以分号结束,只分配存储空间,不产生输出 |
说明:字符数组的定义形式与一维数组完全相同,只是元素类型换成 char。char s[6]; 表示 s[0]~s[5] 共 6 个元素,每个元素存放一个字符,下标从 0 开始。
表10-2 常见字符数组的容量与最多可存字符数
定义语句 | 元素个数 | 占用字节 | 最多存放的字符数 |
char s[6]; | 6 | 6 | 5 |
char s1[10]; | 10 | 10 | 9 |
char s2[20]; | 20 | 20 | 19 |
char c[]="perfect"; | 8 | 8 | 7 |
说明:char 每个元素占 1 个字节,元素个数等于占用字节数。要把一个字符串整个存进去,必须留出一个位置给结束标志 '\0',所以长度为 6 的数组最多只能存 5 个有效字符。
(3)C 语言规定字符 '\0'(ASCII 值为 0 的字符)作为字符串的结束标志符,系统存储字符串常量时会自动在其末尾添加一个 '\0':"perfect" 有 7 个字符,在内存中却占 8 个字节(教材图5-6)。这个 '\0' 不显示、不计数,却是一切字符串处理的依据——后面的 strlen、printf("%s")、puts 都靠它判断字符串到哪儿结束。
程序段:字符串常量在内存中的样子(每个字符占 1 个字节)
/* "perfect" 在内存中:*/
/* p e r f e c t \0 共 8 个字节 */
/* 有效字符 7 个,'\0' 由系统自动加 */
char s[10] = "fashion";
/* 数组长 10、串长 7、占 10 个字节 */
表10-3 三种“零”的辨析(最容易混的考点)
学科网(北京)股份有限公司
学科网(北京)股份有限公司
写法 | 名称 | ASCII 值 | 含义与用途 |
'\0' | 转义字符 NUL | 0 | 字符串结束标志,系统自动加在字符串常量末尾 |
'0' | 数字字符 0 | 48 | 普通的字符,可以显示成数字 0 |
0 | 整型常量 0 | — | 数值零,与字符无关 |
说明:'\0' 是 ASCII 值为 0 的字符,屏幕上显示不出来;'0' 是 ASCII 值 48 的字符,能正常显示。判断字符串是否结束时只能用 '\0' 或 0,写成 '0' 就永远等不到结束,程序会越过数组继续往后读。
(4)字符数组与字符串是“容器与内容”的关系:数组是容器,字符串是装在里面的内容,内容以 '\0' 结尾。教材里 char s1[10]="fashion"; 就是定义了字符数组 s1 存放字符串 "fashion",这时要说清三个数——数组长度 10、字符串长度 7、占用字节 10。字符串长度只数 '\0' 之前的有效字符,与数组长度无关。同理 'a' 是字符常量、占 1 个字节,"a" 是字符串常量、占 2 个字节;"" 是空串,占 1 个字节、串长为 0。
表10-4 字符串常量与字符数组的关系
比较项 | 字符串常量 "perfect" | char s[8]="perfect"; |
有效字符 | 7 个 | 7 个 |
末尾 '\0' | 系统自动添加 | 系统自动添加 |
占用字节 | 8 个 | 8 个 |
能否修改内容 | 不能,是常量 | 能,s[i] 是变量 |
在程序中的写法 | "perfect" | s 或 s[i] |
说明:字符串常量本身就带一个 '\0',所以 "perfect" 占 8 个字节而不是 7 个。字符数组只是把这些字节装进了自己的一块存储空间里,因此能逐个元素修改。
表10-5 数组长度、字符串长度与占用字节的区别
定义语句 | 数组长度 | 字符串长度 | 占用字节 | 能不能放下 |
char s[10]="perfect"; | 10 | 7 | 10 | 能,末尾还有 2 个 '\0' |
char s[]="perfect"; | 8 | 7 | 8 | 能,正好放下 |
char s[8]="perfect"; | 8 | 7 | 8 | 能,长度刚好 |
char s[7]="perfect"; | 7 | — | 7 | 不能,初值超长、编译报错 |
说明:数组长度是“能装多少”,字符串长度是“已经装了多少”,两者不是一回事。字符串 "perfect" 有 7 个字符、占 8 个字节,数组长度必须不小于 8 才装得下。
2.字符数组的初始化
(1)初始化有两条思路:逐个字符赋初值,或直接用字符串常量赋初值。逐个字符写法是 char s[5]={'a','b','c','d','e'};,一个字符对一个元素;系统不会自动补 '\0',所以写满 5 个元素的 s 并不是字符串,而只写前几个时,没有赋到的元素才自动为 '\0'(教材 5.3.2 的例子、图5-7 就是这个状态)。
学科网(北京)股份有限公司
学科网(北京)股份有限公司