1、1,第5章 数组,5.1 一维数组 5.2 二维数组 5.3 字符数组,2,变量只有保存单一数据项的能力。 (如保存一个整数或一个实数) 程序设计中多采用数组来处理批量数据。,3,由若干类型相同的相关数据项按顺序存储在一起形成的一组同类型有序数据的集合,称为数组。 通常,用一个统一的名字标识这组数据,这个名字称为数组名。 构成数组的每个数据项称为数组的元素。,数组,4,例:有1000名学生,每个学生有一个成绩, 求这1000名学生的平均成绩。 用s1,s2,s3,s1000表示每个学生的成绩,下标体现内在联系。 C语言用方括号中的数字表示下标, 例: s15,5,数组是一组有序数据的集合。数组
2、中各数据的排列是有一定规律的,下标代表数据在数组中的序号 用一个数组名和下标惟一确定数组中的元素 数组中的每一个元素都属于同一个数据类型,6,5.1.1 一维数组的定义,一维数组是数组中最简单的 它的元素只需要用数组名加一个下标,就能惟一确定 要使用数组,须在程序中先定义数组,然后才能使用数组。,5.1 一维数组,7,定义一维数组的一般形式为: 类型符 数组名整形常量表达式;,数组名的命名规则和变量名相同 如: int a10;,表示有10个元素,数组长度,8,9,说明: (1)数组名命名规则与变量名相同,遵循标识符命名规则; (2)数组名后的常量表达式必须用方括号; (3)常量表达式表示元素
3、的个数,即数组的长度; 例如:a10表示名字为a 的数组有10个元素, 下标从0开始。,10,(4)常量表达式中可以包含常量和符号常量,但不能包含变量。 即C语言不允许对数组的大小做动态定义。 (即存储单元是在编译时分配的) 换言之,即C程序中,数组的大小不依赖程序运行过程中变量的值。,例如:下面的程序是错误的。 int n=5; scanf(“%d”,&n); int an;,int a4+6; 合法,11,5.1.2 一维数组元素的引用,1)只能逐个引用数组元素,而不能一次引用整个数组 2)数组元素的表示形式为: 数组名下标 3)下标可以是整型常量或整型常量表达式。 例如: a0=a5+a
4、7-a2*3,12,int main() int i,a10; for(i=0;i=0;i-) printf(“%d”,ai); return 0; ,例5.1 :数组元素的引用,定义数组时不能动态定义数组的大小,在引用数组元素时可以使用变量。是变址运算符,使a0a9的值为09,13,对数组元素的初始化可有4种方法实现: (1)在定义数组时对数组元素赋初值。,把数组元素的初值依次放在一对花括号内,经过上述定义和初始化后,各元素的值为:a0=0,a1=1,a9=9。注意没有元素a10。,5.1.3 一维数组的初始化,例如: int a10= 0,1,2,3,4,5,6,7,8,9 ;,14,(2
5、)可以只给一部分元素赋初值。 例如: int a10=0,1,2,3,4;,定义a数组有10个元素,但在花括号内只提供5个初值,表示只给前5个元素赋初值。,后5个元素的值为0。,15,(3)如果想使整个数组中全部元素的值都为0,可写成: int a10=0,0,0,0,0,0,0,0,0,0; 不能写成 int a10=0; 也不能写成 int a10=0*10;,即不能给数组整体赋初值。 一般情况下,C语言是用循环来给数组赋初值的。,16,(4)在定义数组的同时对全部数组元素赋初值,可以不指定数组长度。例如: int a5=1,2,3,4,5; 可以写成: int a =1,2,3,4,5;
6、,系统自动定义a数组有5个元素的长度。 若被定义的数组长度与初值个数不同,则数组长度不能被省略。 如想定义数组长度为10,而只能提供5个初值时,就必须写成: int a10=0,1,2,3,4;,17,例如: void main() int i,a10; a0=0; a1=1; for(i=0;i=9;i+) printf(“%dn”,ai);,说明: 在定义了一个数组后,在没有赋给各元素初值时,数组各个元素的值是不确定的。,输出结果为: 0 1 24 ,注意: 这不是初始化!,18,再例如: void main() int i,a10=0,1,2; for(i=0;i=9;i+) print
7、f(“%dn”,ai); ,19,5.1.4 一维数组程序举例,例5.2 用数组处理求Fibonacci数列问题 解题思路:,算法为: F1=1 F2=1 Fn=Fn-1+Fn-2,20,在循环结构的例题中,有两个变量f1和f2。 int main() long int f1,f2;int i; f1=1;f2=1; for(i=1;i=20;i+) printf(“%12Ld %12Ld”,f1,f2); if(i%2=0) printf(“n”); f1=f1+f2; f2=f2+f1; ,21,int main() int i,f20=1,1; for(i=2;i20;i+) fi=fi
8、-2+fi-1; for(i=0;i20;i+) if(i%5=0) printf(“n”); printf(“%12d”,fi); ,利用循环为数组赋初值,22,例5.3 求最大值元素和下标,并与最后一个元素交换。,算法为: 逐个与标杆max比较。,23, int i,max,p=0; int a10=0,1,2,3,4,9,6,7,8,5; max=a0; for(i=0;i10;i+) if(maxai) max=ai; p=i; ap=ai-1; ai-1=max; ,24,例5.4 用选择法对n个数由小到大排序。,算法为: 每次从待排序数据序列中选择出最小元素并定位到无序序列最前面形
9、成有序序列,25,#define N 6 int i,j,k; int aN,t; for(i=0;iaj) k=j; if(k!=i) t=ak;ak=ai;ai=t; ,用k记住较小数的下标,26,例: 用起泡法对6个数由小到大排序。,算法为: 对相邻两个数进行比较,并把小的放在前面。,第 1 轮交换过程,第 1 轮交换结果,代表比较, 若满足条件,则对换,否则不对换。不对换时也必须进行比较。,27,进行第2轮比较。,由于在第1轮处理后已在最下面,因此本轮不处理。,28,由此可知,对6个数要进行5轮比较,才能使6个数按从小到大的顺序排列。 在第 1 轮中,对每两个数之间的比较要进行 5 次
10、; 在第 2 轮中,对每两个数之间的比较要进行 4 次; 在第 5 轮中,对每两个数之间的比较要进行 1 次。,29,结论: 如果有n个数,则要进行n-1轮的比较。并且: 在第1轮中,对每两个数之间的比较要进行n-1次; 在第2轮中,对每两个数之间的比较要进行n-2次; 在第i轮中,对每两个数之间的比较要进行n-i次。,30,根据以上分析画出NS图,如图,说明: i 为比较的轮次; j 为每轮的比较次数 即形成了嵌套形式: j 为内层循环, i 为外层循环。,31,void main() int a10;int i,j,t; printf(“input :n”); for(i=0;iaj+1)
11、 t=aj;aj=aj+1; aj+1=t;,用循环为数组赋初值,外层循环次数:轮次=个数-1,内层循环次数: 个数轮次,比较两个数的大小。,利用临时单元进行对换,32,printf(“the sorted numbers:n”); for(i=0;i10;i+) printf(“%d”,ai); ,33,定义: 二维数组定义的一般形式为: 类型说明符 数组名常量表达式常量表达式,例如: float a34,b510; 定义: a 为3X4 (3行4列) 的数组; b 为5X10(5行10列)的数组。,5.2.1 二维数组的定义,5.2 二维数组,34,二维数组中元素在内存中的排列顺序是“按行
12、存放”,35,可以把二维数组看成是一种特殊的一维数组。,例如把二维数组 a 看成是有3个元素的一个一维数组,每个元素分别为: a0 a1 a2,36,37,即: float a34; 可以理解为:定义了3个一维数组, 每个一维数组有4个元素。 相当于: float a04,a14,a24;,由于: 每个一维的数组元素a0又是一个包含了 4个元素的一维数组。 因此: 将a0、a1、a2看成是3个一维数组的名字。,38,C语言允许使用多维数组。 例如:定义三维数组的方法是: float a234; 同理,可推出定义 n 维数组的定义形式。,数组的元素可以是任意数据类型, 包括可以是数组类型。,39
13、,多维数组元素在内存中的排列顺序: 第一维的下标变化最慢,最右边的下标变化最快。 例如,三维数组元素的排列顺序为:,40,二维数组元素的表示形式为: 数组名下标下标 例如: a23,对数组元素的引用即: 各种表达式中可以引用数组元素。 表达式中的数组元素也可被赋值。 例如: b12=a23/2,下标可以是整型表达式。 例如: a2-12*2-1,5.2.2 二维数组元素的引用,41,使用下标一定要限制在已定义的数组大小范围内。 例如: int a34; a34=3; 这是错误的引用 定义了a为3X4数组,但它可使用的最大下标值: 行为2,列为3。,一定要区分开: 定义数组时用的 a34 和 引
14、用数组时用的 a34 的区别。 前者是定义数组维数的大小, 后者是元素的下标值。,42,例5.5 输入输出, int i,j,a53; for(i=0;i5;i+) for(j=0;j3;j+) scanf(“%d”, ,外层行 内层列,43,可以修改为:, int i,j,a53; for(i=0;i5;i+) for(j=0;j3;j+) scanf(“%d”, ,44,5.2.3 二维数组的初始化 有4种方法对二维数组进行初始化。,(2)按排列顺序对各元素赋初值,如: int a34=1,2,3,4,5,6,7,8,9,10,11,12;,(1)分行给二维数组赋初值,如: int a34
15、=1,2,3,4,5,6,7,8,9,10,11,12;,45,只对前两个元素赋初值,后面10个元素为“0”。相当于按排列顺序赋值。,只对各行第0列元素赋初值,其余自动为“0”。赋值后数组形式为: 1 0 0 0 5 0 0 0 9 0 0 0,(3)对部分元素赋初值。 例:int a34=1,2;,例:int a34=1,5,9;,46,例:int a34=1,0,6,0,0,11;,对各行中的某一元素赋初值。其余部分自动为“0”。部分需赋给“0”,初始化后数组形式为: 1 0 0 0 0 6 0 0 0 0 11 0,47,例: int a34=1,5,6;,对某几行中的部分元素赋初值。初
16、始化后数组形式为: 1 0 0 0 5 6 0 0 0 0 0 0,int a34=1, ,5,6; 也是不允许的。,不能象 for 语句那样写成: int a34=1,5,6; 1 0 0 0 0 0 0 0 5 6 0 0,48,(4)定义数组时,可以省略数组的第一维长度,但不能省略第二维的长度。(有2种方法),对全部元素都赋初值 例如: int a34=1,2,3,4,5,6,7,8,9,10,11,12; 可以写成: int a 4=1,2,3,4,5,6,7,8,9,10,11,12;,分行赋初值 例如:int a 4=0,0,3,0,0,10; 用数组的行定义第一维的长度。,49,
17、5.2.4 二维数组程序举例 例5.6 与例5.3类似(略),50,例: 把一个二维数组的行和列互换,保存到另一个数组中。即把数组 a 变换成数组 b 。,程序要点: 1)如何定义数组,并区分定义数组和引用数组元素(关键看下标的使用)。 2)利用循环,对数组的操作大多使用循环。 3)充分理解内层循环和外层循环。,51,void main() int a23= 1,2,3,4,5,6 ; int b32;int i,j; for( i=0;i=1;i+) for( j=0;j=2;j+) printf(“%5d”,aij); bji=aij; printf(“n”); ,先从内层循环开始。 内层
18、循环一般是处理数组的高维。,52,printf(“array b:n”); for( i=0;i=2;i+) for( j=0;j=1;j+) printf(“%5d”,bij); printf(“n”); ,53,例: 有一个3X4的矩阵,要求出其中值最大的那个元素的值,并指出其所在的行号和列号。,程序要点: 1)定义一个3X4数组,并可用多种方法赋初值。 2)区分内外层循环。 3)确定下标范围。,关于数组,54,4)确定算法。 以第一个元素为标杆 把后面的元素与标杆进行比较 满足条件则替换,关于算法,关于量,5)确定变量 存放最大数 存放最大数所在行、列号 内外层循环变量,55,56,vo
19、id main() int i,j,row=0,colum=0,max; int a34= 1,2,3,4,9,8,7,6, -10,10,-5,2 ; max=a00; 把元素的值赋给max变量做为标杆 for( i=0;i max ) max=a i j ;row=i;colum=j; printf(“max=%d,row=%d,colum=%dn”,max,row,colum);,57,5.3.1 字符数组的定义,用来存放字符数据的数组是字符数组。 字符数组中的一个元素只能存放一个字符。,定义形式为: 类型说明符 数组名 常量表达式 ,5.3 字符数组,58,例如:char c10 ;
20、定义 c 为字符数组名,有10个元素。赋值后: c0=I;c1= ;c2=a;c3=m;c4= ;c5=h;c6=a;c7=p;c8=p;c9=y;,也可用整型数组存放字符型数据, 例如:int c10=A; 但每个整型数占4个字节。,数组在内存中的存放形式如图所示。,59,5.3.2 字符数组的初始化 几个约定: 1)必须逐个字符赋给数组中的各个元素; 如: char c10=I, ,a,m, ,h,a,p,p,y;,2)若初值个数(即字符个数)大于数组长度,则语法错。,把10个字符分别赋给c0c9这10个元素。,60,3)若初值个数小于数组长度,则只把这些字符赋给数组中前面相对应数目的元素
21、,其余元素则,自动指定为”空字符“(即 0); 例如: char c11=C, ,p,r,o,g,r,a,m; 数组状态如图:,61,4)若提供的初值个数与数组长度相同,则定义时可省略数组长度。系统会根据初值个数自动确定数组长度;,这种方法在赋初值的字符个数较多时比较方便。,例如: char c =C, ,p,r,o,g,r,a,m;,长度不同,62,5)也可定义和初始化一个二维字符数组。 例如:char diamond55= , ,* , ,*, ,* ,*, , , ,* , ,*, ,* , , ,* ;,63,5.3.3 字符数组的引用 是通过引用数组中的一个元素,得到一个字符。,一个
22、一个的输出字符, 形成字符串。,例5.8 输出一个字符串。 void main() char c10=I, ,a,m, ,a, ,b,o,y; int i; for( i=0;i10;i+) printf(“%c”,c i ); printf(“n”); ,64,例5.9 输出一个钻石图形 void main() char diamond 5= , , * , , *, , * ,*, , , , * , , *, ,* , , ,* ; int i,j; for( i=0;i5;i+) for( j=0;j5;j+) printf(“%c”,diamondij); printf(“n”);
23、,空格不是空字符,65,字符串和字符串结束标志 字符串是用双引号括起来的字符。 C语言中把字符串作为一维字符数组来存放的。 并且用 0 表示结束。 例如: “I am happy” 在内存中的形式为:,66,因此,可以用字符串常量使字符数组初始化。 例如:char c = “I am happy”; 或 :char c =“I am happy”;,注意: 1)不是用单引号括起来的单个字符为每个元素赋初值,而是用双引号括起来的字符串作为初值。 2)这个数组的长度不是10,而是11。 3)字符数组并不要求它的最后一个字符为0 ,甚至可以不包含0。,67,上述初始化与下式相等: Char c =I
24、, ,a,m, ,h,a,p,p,y,0; 而不与下式相等: Char c = I, ,a,m, ,h,a,p,p,y;,前者的长度为11,后者的长度为10,68,在C语言中,是将字符串作为字符数组来处理的 关心的是字符串的有效长度而不是字符数组的长度 为了测定字符串的实际长度,C语言规定了字符串结束标志0,69,0代表ASCII码为0的字符 从ASCII码表可以查到,ASCII码为0的字符不是一个可显示的字符,而是一个“空操作符”,即它什么也不做 用它作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志,70,char c10=“China”; 可写成 char c10=
25、“China”; 从c5开始,元素值均为0 只显示: printf(“%s”,c);,0并不产生一个换行,71,字符数组的输入输出有两种方法:,(1)逐个字符输入输出。 用格式符 “%c” 输入或输出一个字符。 例如:printf(“%c”,c i );,72,(2)把整个字符串一次输入输出。 用格式符 “%s”。 例如:char c =“China”; 系统自动在后面加0 printf(“%s”,c); 输出时遇到0停止 数组在内存中的形式如下:,73,注意: (1)输出字符不包括0。 (2)用“ %s” 格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。 (3)
26、如果数组长度大于字符串实际长度,也只输出到遇0结束。 (4)如果字符数组中包括一个以上的0,也遇第一个0时结束。,74,用scanf(“%s”,c);输入一个字符串。,(1)函数中的输入项c是字符数组名,应在使用前已定义。 (2)从键盘输入的字符串应短于已定义的字符数组的长度。 (3)当结束一个字符串的输入时,系统自动在串尾加0。 (4)如果用scanf函数从键盘输入多个字符串时,则以空格分隔。(空格的ASCII码为032,不是0),75,例如: char str15,str25,str35; scanf(“%s%s%s”,str1,str2,str3);,用空格键分隔输入数据后数组的形式如图
27、。 数组中未被赋值的元素的值是不可预料的。,76,若改为: char str13; scanf(“%s”,str);,以同样的方式输入同样的数据后数组的形式如图,其他数据并未接受。,77,注意: scanf函数的输入项是数组的名字,不需加地址符&。因为数组名本身已经代表数组的起始地址(首地址),若写成: printf(“%o”,c); 则输出字符数组c的起始地址:2000,所以:printf(“%s”,c);是按名字c找到数组的起始地址,然后再逐一输出其中的字符,直到遇0为止。,78,puts(字符数组) 作用:把一个字符串(以0结束)输出到终端。 例如: char str =“ChinanB
28、eijing”; puts(str); 输出:China Beijing _,与printf函数不同,puts函数在输出时把0转换成n,即换行。,5.3.4 字符串处理函数,79,gets(字符数组) 作用:从终端输入一个字符串到字符数组,并得到一个函数值。,注意:用gets和puts函数只能输入/ 输出一个字符串不能写成: puts(str1,str2) 或 gets(str1,str2),说明: 1)此函数值为字符数组的起始地址。 2)一般用gets函数的目的是向字符数组输入一个字符串,因而很少关心其函数值。 3)用回车结束输入,空格作为字符输入。,输入时把回车转换成0,80,strcat
29、(字符数组1,字符数组2) 作用:连接两个字符数组中的字符串。 过程:把字符串2连接到字符串1 的后面。 结果:结果放在字符数组1中,函数调用后得到的函数值是字符数组1 的首地址。,81,例如:char str130=“Peoples Republic of_”; char str2 =“China”; printf(“%s”,strcat(str1,str2); 连接前后的状态如图所示:,说明:1)字符数组1 必须足够大。 2)连接后,在新串后面只保留一个0。,82,strcpy(字符数组1,字符串2) 作用:把字符串2复制到字符数组1中。 例如: char str110,str2 =“Ch
30、ina”; strcpy(str1,str2); 执行后,str1的形式如图:,str1,83,说明: 字符数组1必须定义得足够大,至少字符数组1的长度不小于字符串2的长度; 字符数组1必须为字符数组名。字符串2可以是字符数组名,也可是一个“字符串”; 例如:strcpy(str1, “china”); (3)连同字符串2后面的 0 一起复制到字符数组1中;,84,(4)不能用赋值语句把一个字符串常量或字符数组直接赋给一个字符数组,必须用strcpy函数处理。 例如:下面是非法的操作 str1=“china”; 或 str1=str2;,而合法的是: char a5,c1,c2; a0=C;a
31、1=h;a2=i;a3=n;a4=a;,str1是字符数组名。 定义时可以初始化如: str =“THIS”;,85,(5)可以用strncpy函数把字符串2中前面若干个字符复制到字符数组1中去。 例如: strncpy(str1,str2,2 ); 作用是把str2中前2个字符复制到字符数组1中,即取代str1中前2个字符,而其他字符不变。,(6)无论是使用strcpy前还是进行了strcpy后,str2中的内容不变。,86,5. strcmp(字符串1,字符串2) 作用:比较字符串1和字符串2的ASCII码值 的大小 规则: 对两个字符串自左向右逐个字符按ASCII码值大小进行比较,直到出
32、现不同的字符(或遇到 0 )为止。若全部字符都相同,认为两个字符串相等, 若出现了不同字符,则以第1个不相同的字符的比较结果为准。,例如: “A”A” 小写字母大于大写字母,87,结果:比较的结果由函数值带回,有3种可能: (1) 字符串1=字符串2 此时,函数值为0 (2) 字符串1字符串2 函数值为一个正整数 (3) 字符串1字符串2 函数值为一个负整数,例如: char str110=“committee”; char str210=“committee”; strcmp(str1,str2); printf(“%d”,strcmp(str1,str2); 输出结果为”0“。,88,若改
33、为: char str110=“Committee”; char str210=“dommittee”; printf(“%d”,strcmp(str1,str2); 输出结果为:-1,若改为: char str110=“committee”; char str210=“Committee”; strcmp(str1,str2); printf(“%d”,strcmp(str1,str2);,不能写成: printf(“%d”,strcmp);,函数返回的值是所比较的两个字符串中不同字符的ASCII码值大小的“真假”,输出结果为:+1,89,注意: 不能用以下形式比较字符串。 if(str1=
34、str2) printf(“yes”); 只能用 if(strcmp(str1,str2)=0) printf(“yes”);,90,6. strlen(字符数组) 作用:测试字符串长度。 结果:函数的值为字符串的长度,不包含 0 。,例如: char str10=“China”; printf(“%d”,strlen(str); 输出结果为 5。,91,7. strlew(字符串) 作用:把字符串中的大写字母转换成小写字母。 8. strupr(字符串) 作用:把字符串中的小写字母转换成大写字母。,92,5.3.5 字符数组应用举例 例5.13 输入一行字符,统计其中的大、小写字母、 数字和
35、其他符号的个数。,93, int i,c4=0; char str80; gets(str); for(i=0;stri!=0;i+) if(stri=a ,94,例: 输入一行字符,统计其中有多少个单词, 每个单词之间用空格分开。 设:输入字符串如下: #I#am#a#boy.,例5.14 参见讲义P96,95,分析: 1)单词的数目与空格出现的与否有关, 因此: 令:单词数为 num 是否出现空格为 word,2)若一个字符为 “非空格” ,而“其前面” 的字符“是”空格,表示一个新的单词开始,即单词数增加, 因此: num=num+1,#I#am#a#boy.,96,3)若一个字符为 “
36、非空格” ,而 “其前面”的字符“也非”空格,表示一个单词尚未结束,单词数不应增加, 因此: num=num,4)所谓 “其前面”的字符是否为空格,可由word的值看出。 即设word=0 表示“前”一个字符为“是”空格 word=1 表示“前”一个字符为“非”空格,#I#am#a#boy.,97,是空格,则表示未出现新单词; 否,可能为新单词,也可能是原单词的继续。 因此要看前一字符是否为0(是空格)。,#I#am#a#boy.,判断: 1)关键是判断“当前”字符是否为空格; 2)然后再判断是否新单词; 3)要对字符串中的每个字符逐一进行上述判断。,98,把上述判断过程图示如下:,#I#am
37、#a#boy.,99,程序设计要点: 1)在分析中,已定义了计数单词个数的变量num。 2)已定义了标志是否为单词的逻辑量word。 3)由于对一个字符串需逐个判断每个字符(即使每个字符顺序地成为当前字符),因此需要有循环结构,并定义循环变量i,以使循环能趋于结束。 4)由图可以看出,程序结构中包含有分支结构(如 yes、no)。 5)分支结构应包含在循环结构之内。,#I#am#a#boy.,100,算法: 1)定义一个字符数组,并输入一个字符串。 2)定义一个临时字符变量,用来存放“当前字符”。 3)定义循环i、标志word、计数num变量。,#I#am#a#boy.,101,#includ
38、e void main() char string81; int i,num=0,word=0; char c; gets(string); for(i=0;(c=stringi)!=0;i+) if(c= ) word=0; else if(word=0) word=1;num=num+1; ,输入一个字符串。 scanf只把一个字符串中空格或回车前的字符送入数组中。gets(string)函数只能用回车结束输入,允许输入空格。,#I#am#a#boy.,102,例5.15 有3个字符串,要求出其中最大者。,分析: 1)设一个二维字符数组str,大小为3x20。因此可以把str0、str1、
39、str2看成3个一维字符数组。 2)用gets函数分别读入3个字符串。 3)算法与求3个整数中的最大者相同。,103,#include #include void main() char string20; 定义一个临时数组 char str320; 定义一个二维数组 int i; for(i=0;i0) strcpy(string,str0); else strcpy(string,str1); 把比较后的大者放入string数组中 if(strcmp(str2,string)0) strcpy(string,str2); printf(“nthe largest string is:n%s
40、n”,string);,104,例5.16 求子串。,chanr str120,str22; int i,len,k,j; gets(str1); scanf(“%d%d”, ,从i开始到串尾的剩余部分,含0。,105,关于字符数组: 1、char c10=“china”; 正确 2、char c4 =“china”; 错误,3、char c=c,h,i,n,a; 4、char c=“china”;,由上可知:数组长度是被定义的 数组长度不可被测量 由4可知:串长度为5,占6个字节。注意串长和字节数的概念 串长可以被测量(strlen) 由3可知:不是串,而是元素(字节) 因此无法知道串长。 推 论:字符串一定是一维数组; 而字符数组不一定是字符串,106,作业: 习题:3、4、5、13、14,