C语言数组详解.ppt
L就是一组具有就是一组具有就是一组具有就是一组具有固定数目的固定数目的固定数目的固定数目的、有序的有序的有序的有序的、类型相同类型相同类型相同类型相同的的的的数据的集合。根据数组下标的多少,数组可以分为数据的集合。根据数组下标的多少,数组可以分为数据的集合。根据数组下标的多少,数组可以分为数据的集合。根据数组下标的多少,数组可以分为一维数组和多维数组。一维数组和多维数组。一维数组和多维数组。一维数组和多维数组。n例如:一个班级有例如:一个班级有3030个学生,可以用个学生,可以用g g1 1,g,g2 2,g,g3030代表学生的成绩,其中代表学生的成绩,其中g g是数组名,下是数组名,下标代表学生的序号。由于在标代表学生的序号。由于在C C语言中无法表示下标,语言中无法表示下标,所以就引入了所以就引入了 表示下标。表示下标。ng1:g1:第第1 1个学生的成绩个学生的成绩ngi:gi:第第i i个学生的成绩等等个学生的成绩等等(一)一维数组(一)一维数组(1 1)定义及使用定义及使用类型说明符类型说明符类型说明符类型说明符 数组名数组名数组名数组名 常量表达式常量表达式常量表达式常量表达式 int a10 int a10任一种任一种基基本数据类本数据类型型或构造或构造数据类型。数据类型。用户自定义的数组用户自定义的数组名字,其定名规则名字,其定名规则与变量名定名规则与变量名定名规则一样,都需遵循一样,都需遵循标标识符定名规则识符定名规则表示元素表示元素的个数,的个数,即数组长即数组长度。度。下标运下标运算符算符单目运算符单目运算符优先级优先级(1)左结合左结合不能用不能用()注意:注意:1.数组名数组名不能不能与其它变量名相同与其它变量名相同voidmain()inta;floata10;(一)一维数组(一)一维数组(1 1)定义及使用定义及使用2.2.不能在方括号中用不能在方括号中用不能在方括号中用不能在方括号中用变量变量来表示元素的个来表示元素的个来表示元素的个来表示元素的个数,但可以是数,但可以是数,但可以是数,但可以是符号常数或常量表达式符号常数或常量表达式。int n;int n;scanf(%d,&n);scanf(%d,&n);/*/*表示维表示维表示维表示维数的只能是常量数的只能是常量数的只能是常量数的只能是常量*/*/int an;int an;#define FD 5#define FD 5 void main()void main()int a3+2,b7+FD;int a3+2,b7+FD;(一)一维数组(一)一维数组(1 1)定义及使用定义及使用3.方括号中常量表达式表示数组元素方括号中常量表达式表示数组元素的个数。的个数。如如int a5:数组数组a有有5个元个元素,其素,其下标从下标从0开始开始,分别为,分别为a0,a1,a2,a3,a4。4.允许在同一个类型说明中说明多个数允许在同一个类型说明中说明多个数组和多个变量。组和多个变量。例如:例如:int a,b,c,d,k110,k220;如果出现数如果出现数如果出现数如果出现数组越界,组越界,组越界,组越界,编译系统编译系统编译系统编译系统没有提示没有提示没有提示没有提示的。的。的。的。(一)一维数组(一)一维数组(1 1)定义及使用定义及使用E 数组必须数组必须数组必须数组必须先定义,然后使用先定义,然后使用先定义,然后使用先定义,然后使用。E 数组元素的表示形式为:数组元素的表示形式为:数组元素的表示形式为:数组元素的表示形式为:数组名数组名数组名数组名 下标下标下标下标 E C C语言规定语言规定语言规定语言规定只能逐个引用数组元素只能逐个引用数组元素只能逐个引用数组元素只能逐个引用数组元素而不能一次而不能一次而不能一次而不能一次引用整个数组。引用整个数组。引用整个数组。引用整个数组。p可以是整型常量可以是整型常量或整型表达式或整型表达式(一)一维数组(一)一维数组(2 2)引用引用O 全部初始化全部初始化O 部分初始化部分初始化O 使用输入函数使用输入函数scanf初始化初始化O 使用表达式赋值使用表达式赋值int a10=0,1,2,3,4,5,6,7,8,9;a0=0;a1=1;a2=2;a3=3;a4=4;a5=5;a6=6;a7=7;a8=8;a9=9;int a10=0,1,2,3;a0=0;a1=1;a2=2;a3=3;a4=0;a5=0;a6=0;a7=0;a8=0;a9=0;int a10;for(int i=0;i10;i+)scanf(%d,&ai);int a10=0,1,2,3;a4=a3+2;对全部数组元素赋初值时,数组对全部数组元素赋初值时,数组对全部数组元素赋初值时,数组对全部数组元素赋初值时,数组长度可以省略长度可以省略长度可以省略长度可以省略(一)一维数组(一)一维数组(3 3)初始化初始化int a5=1,2,3,4,5;54321a4a3a2a1a020202016201220082004a#include#include void main()void main()int a5=0,1,2,3,4;int a5=0,1,2,3,4;for(int i=0;i5;i+)for(int i=0;i5;i+)printf(a%d=%d,printf(a%d=%d,其地址是其地址是其地址是其地址是%dn,i,ai%dn,i,ai,&ai,&ai););printf(printf(数组的首地址为数组的首地址为数组的首地址为数组的首地址为:%dn,:%dn,a a););printf(printf(数组数组数组数组a a在内存中占字节数在内存中占字节数在内存中占字节数在内存中占字节数:%dn,:%dn,sizeof(a)sizeof(a););数组名表示数组名表示数组数组的起始地址的起始地址,是,是一个地址常量一个地址常量程序举例程序举例程序举例程序举例1 1 1 1:用选择排序法进行排序。用选择排序法进行排序。用选择排序法进行排序。用选择排序法进行排序。选择排序法是编程中经常用的一种排序算选择排序法是编程中经常用的一种排序算选择排序法是编程中经常用的一种排序算选择排序法是编程中经常用的一种排序算法。具体如下:法。具体如下:法。具体如下:法。具体如下:先将先将先将先将5 5 5 5个数中最小的数与个数中最小的数与个数中最小的数与个数中最小的数与a0a0a0a0对换,再将对换,再将对换,再将对换,再将a1a1a1a1到到到到a4a4a4a4中最小的数与中最小的数与中最小的数与中最小的数与a1a1a1a1对换,这样每比对换,这样每比对换,这样每比对换,这样每比较一轮,找出一个未经排序的数中最小的一较一轮,找出一个未经排序的数中最小的一较一轮,找出一个未经排序的数中最小的一较一轮,找出一个未经排序的数中最小的一个。共比较个。共比较个。共比较个。共比较4 4 4 4轮。轮。轮。轮。int a5=3,6,1,9,4;int a5=3,6,1,9,4;int a5=3,6,1,9,4;int a5=3,6,1,9,4;1.4 1.4一维数组程序举例一维数组程序举例a0 a1 a2 a3 a4a0 a1 a2 a3 a4 3 6 1 9 4 3 6 1 9 4 未排序的情况未排序的情况 1 6 3 9 4 1 6 3 9 4 将将5 5个数中最小的数个数中最小的数1 1与与 a0 a0对换对换 1 3 6 9 4 1 3 6 9 4 将余下的将余下的4 4个数中最小的数个数中最小的数 3 3与与a1 a1 对换对换 1 3 4 9 6 1 3 4 9 6 将余下的将余下的3 3个数中最小的数个数中最小的数 4 4与与a2 a2 对换对换 1 3 4 6 9 1 3 4 6 9 将余下的将余下的2 2个数中最小的数个数中最小的数 6 6与与 a3 a3 对换对换main()main()int i,j,k,t;int i,j,k,t;int a5=3,6,1,9,4;int a5=3,6,1,9,4;for(i=0;i sizeof(a)/sizeof(int)1;i+)for(i=0;i sizeof(a)/sizeof(int)1;i+)k=i;k=i;for(j=i+1;j sizeof(a);j+)for(j=i+1;j sizeof(a);j+)if(aj ak)k=j;if(aj ak)k=j;if(k!=i)if(k!=i)t=ai;ai=ak;ak=t;t=ai;ai=ak;ak=t;N 数组的起始下标、最后一个元素的下标数组的起始下标、最后一个元素的下标数组的起始下标、最后一个元素的下标数组的起始下标、最后一个元素的下标N 定义数组时不指定长度定义数组时不指定长度定义数组时不指定长度定义数组时不指定长度(动态数组动态数组动态数组动态数组)N 对数值型数组进行整体操作对数值型数组进行整体操作对数值型数组进行整体操作对数值型数组进行整体操作N 用用用用scanfscanf语句时,数组元素前应加语句时,数组元素前应加语句时,数组元素前应加语句时,数组元素前应加&语句错误,不了解数组定义时与数组元语句错误,不了解数组定义时与数组元语句错误,不了解数组定义时与数组元语句错误,不了解数组定义时与数组元素使用时的区别素使用时的区别素使用时的区别素使用时的区别:scanf(“%d”,a10);scanf(“%d”,a10);N 一维数组的定义、初始化、引用、输入、输一维数组的定义、初始化、引用、输入、输一维数组的定义、初始化、引用、输入、输一维数组的定义、初始化、引用、输入、输出概念、操作必须掌握出概念、操作必须掌握出概念、操作必须掌握出概念、操作必须掌握N 数组中的所有元素,数据类型都一致数组中的所有元素,数据类型都一致数组中的所有元素,数据类型都一致数组中的所有元素,数据类型都一致N 数组名字代表数组的首地址,是一个常量数组名字代表数组的首地址,是一个常量数组名字代表数组的首地址,是一个常量数组名字代表数组的首地址,是一个常量N数组元素具有和相同单个变量一样的属性,凡数组元素具有和相同单个变量一样的属性,凡数组元素具有和相同单个变量一样的属性,凡数组元素具有和相同单个变量一样的属性,凡允许使用单个变量的地方均可以使用数组元素允许使用单个变量的地方均可以使用数组元素允许使用单个变量的地方均可以使用数组元素允许使用单个变量的地方均可以使用数组元素(二)二维数组(二)二维数组定义及使用定义及使用这儿只讨论二维数组,多维数组可由二维数组这儿只讨论二维数组,多维数组可由二维数组推导得出推导得出二维数组定义的一般形式为:二维数组定义的一般形式为:类型说明符类型说明符数组名数组名常量表达式常量表达式常量表达常量表达式式第一常量表达式为行数,第二个为列数第一常量表达式为行数,第二个为列数inta34;floata3,4,b5,10;/*错误错误*/二维数组中的元素在二维数组中的元素在内存中的排列顺序是:按内存中的排列顺序是:按行存放,即先顺序存放第行存放,即先顺序存放第一行的元素,再存放第二一行的元素,再存放第二行的元素行的元素 二二二二维数组在内存中的存放维数组在内存中的存放维数组在内存中的存放维数组在内存中的存放下图表示对下图表示对下图表示对下图表示对a a3 34 4数组存放的顺序数组存放的顺序数组存放的顺序数组存放的顺序 int a23=1,2,3,4,5,6;a0654321a12a11a10a02a0120222018201420102006a002002a1(二)二维数组(二)二维数组存储方式存储方式#include#include void main()void main()int a23=1,2,3,4,5,6,i,j;int a23=1,2,3,4,5,6,i,j;for(i=0;i2;i+)for(i=0;i2;i+)for(j=0;j3;j+)for(j=0;j3;j+)printf(printf(第第第第a%d%da%d%d元素元素元素元素=%d=%d,其地,其地,其地,其地址为址为址为址为:%dn,i,j,aij,&aij);:%dn,i,j,aij,&aij);printf(a=%dta0=%dta1=%dn,a,a0,printf(a=%dta0=%dta1=%dn,a,a0,a1);a1);(二)二维数组(二)二维数组引用引用二维数组的表示形式:二维数组的表示形式:数组名数组名下标下标下标下标注意:注意:N 下标可以是整型表达式,如下标可以是整型表达式,如a2-12*2-1N 数组元素可以出现在表达式中,也可以被赋值数组元素可以出现在表达式中,也可以被赋值 b12=a23/2;N 在使用数组元素时,应该注意下标值应在已定在使用数组元素时,应该注意下标值应在已定义的数组大小范围内义的数组大小范围内 int a34;a34=5;N 严格区分在定义数组时用的严格区分在定义数组时用的a34和引用元素和引用元素时的时的a34O 全部初始化全部初始化O 部分初始化部分初始化O 使用输入函数使用输入函数scanf初始化初始化int a23=0,1,2,3,4,5;int a23=0,1,20,1,2,3,4,53,4,5;a00=0;a01=1;a02=2;a10=3;a11=4;a12=5;int a23=int a23=0,1,20,1,2;int a23=0,1;int a23=0,1;a00=0;a01=1;a02=2;a10=0;a11=0;a12=0;int a23;for(int i=0;i2;i+)for(int j=0;j3;j+)scanf(%d,&aij);对全部数组元素赋初值时,第一对全部数组元素赋初值时,第一对全部数组元素赋初值时,第一对全部数组元素赋初值时,第一维的长度可以省略维的长度可以省略维的长度可以省略维的长度可以省略(二)二维数组(二)二维数组初始化初始化(二)二维数组(二)二维数组程序举例程序举例例例例例3 3:一个学习小组有:一个学习小组有:一个学习小组有:一个学习小组有5 5个人,每个人有三门课的考试个人,每个人有三门课的考试个人,每个人有三门课的考试个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。成绩。求全组分科的平均成绩和各科总平均成绩。成绩。求全组分科的平均成绩和各科总平均成绩。成绩。求全组分科的平均成绩和各科总平均成绩。EnglishMathC张张807592王王616571李李596370赵赵858790周周767785(二)二维数组(二)二维数组程序举例程序举例例例例例3 3:一个学习小组有:一个学习小组有:一个学习小组有:一个学习小组有5 5个人,每个人有三门课的考试成绩。求全个人,每个人有三门课的考试成绩。求全个人,每个人有三门课的考试成绩。求全个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。组分科的平均成绩和各科总平均成绩。组分科的平均成绩和各科总平均成绩。组分科的平均成绩和各科总平均成绩。for i=0 to 2for i=0 to 2for j=0 to 4for j=0 to 4sumi+=scoreijsumi+=scoreijavgi=sumi/5avgi=sumi/5for i=0 to 2for i=0 to 2output avgioutput avgiavg+=avgiavg+=avgioutput avg/3output avg/3#include#define N 3#define M 5#include#define N 3#define M 5void main()void main()float scoreNM,avg1=0,avgN,sumN=0;float scoreNM,avg1=0,avgN,sumN=0;int i,j;int i,j;for(i=0;iN;i+)for(i=0;iN;i+)for(j=0;jM;j+)for(j=0;jM;j+)printf(printf(第第第第%d%d门课门课门课门课,第第第第%d%d个学生的成绩个学生的成绩个学生的成绩个学生的成绩:,i,j);:,i,j);scanf(%f,&scoreij);scanf(%f,&scoreij);for(i=0;iN;i+)for(i=0;iN;i+)for(j=0;jM;j+)for(j=0;jM;j+)sumi+=scoreij;sumi+=scoreij;avgi=sumi/M;avgi=sumi/M;for(i=0;iN;i+)for(i=0;iN;i+)printf(printf(第第第第%d%d门课的平均成绩为门课的平均成绩为门课的平均成绩为门课的平均成绩为%.2fn,i,avgi);%.2fn,i,avgi);avg1+=avgi;avg1+=avgi;printf(printf(各科总平均成绩为各科总平均成绩为各科总平均成绩为各科总平均成绩为%.2fn,avg1/N);%.2fn,avg1/N);二维数组在内存中是按行存放二维数组在内存中是按行存放二维数组在内存中是按行存放二维数组在内存中是按行存放 数组元素的下标每一维都是从数组元素的下标每一维都是从数组元素的下标每一维都是从数组元素的下标每一维都是从0 0开始的开始的开始的开始的 数值型数组不能够整体引用数值型数组不能够整体引用数值型数组不能够整体引用数值型数组不能够整体引用 可以把二维数组看成是一个特殊的一维数组,可以把二维数组看成是一个特殊的一维数组,可以把二维数组看成是一个特殊的一维数组,可以把二维数组看成是一个特殊的一维数组,即其元素是一个一维数组即其元素是一个一维数组即其元素是一个一维数组即其元素是一个一维数组 二维数组初始化有两种方法:按行赋值或者二维数组初始化有两种方法:按行赋值或者二维数组初始化有两种方法:按行赋值或者二维数组初始化有两种方法:按行赋值或者一行赋值一行赋值一行赋值一行赋值(三)字符数组(三)字符数组定义定义字符数组字符数组:用来存放字符数据的数组:用来存放字符数据的数组就是字符数组。就是字符数组。定义方式:定义方式:char数组名数组名长度长度一维数组:一维数组:chara10;二维数组:二维数组:chara45;(三)字符数组(三)字符数组初始化初始化对字符数组初始化,对字符数组初始化,对字符数组初始化,对字符数组初始化,最容易理解的方式是逐个最容易理解的方式是逐个最容易理解的方式是逐个最容易理解的方式是逐个字符赋给数组中各元素。如:字符赋给数组中各元素。如:字符赋给数组中各元素。如:字符赋给数组中各元素。如:Char c10=I,aChar c10=I,a,mm,,hh,aa,pp,pp,y;y;如果在定义字符数组时不进行初始化,如果在定义字符数组时不进行初始化,如果在定义字符数组时不进行初始化,如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。则数组中各元素的值是不可预料的。则数组中各元素的值是不可预料的。则数组中各元素的值是不可预料的。如果花括弧中提供的初值个数如果花括弧中提供的初值个数如果花括弧中提供的初值个数如果花括弧中提供的初值个数(即即即即字符个数字符个数字符个数字符个数)大于数组长度,则按语法错大于数组长度,则按语法错大于数组长度,则按语法错大于数组长度,则按语法错误处理。误处理。误处理。误处理。注意注意注意注意:如果初值个数小于数组长度,则只将这些字符赋给数如果初值个数小于数组长度,则只将这些字符赋给数如果初值个数小于数组长度,则只将这些字符赋给数如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符组中前面那些元素,其余的元素自动定为空字符组中前面那些元素,其余的元素自动定为空字符组中前面那些元素,其余的元素自动定为空字符(即即即即0)0)0)0)。例如:。例如:。例如:。例如:char cchar cchar cchar c10101010=c=c=c=c,pppp,rrrr,oooo,gggg,rrrr,aaaa,m;m;m;m;在定义字符数组时可以省略数组长度,系统会在定义字符数组时可以省略数组长度,系统会在定义字符数组时可以省略数组长度,系统会在定义字符数组时可以省略数组长度,系统会自动根据初值个数确定数组长度。例如:自动根据初值个数确定数组长度。例如:自动根据初值个数确定数组长度。例如:自动根据初值个数确定数组长度。例如:char cchar cchar cchar c=I,a,m,h,=I,a,m,h,=I,a,m,h,=I,a,m,h,a,p,p,y;a,p,p,y;a,p,p,y;a,p,p,y;数组数组数组数组c c c c的长度自动定为的长度自动定为的长度自动定为的长度自动定为10101010。#include void main()char c10=I,a,m,a,b,o,y;int i;for(i=0;i10;i+)printf(“%c”,ci);printf(“n”);(三)字符数组(三)字符数组引用引用可以引用字符数组中的一个元素,得到一个字符可以引用字符数组中的一个元素,得到一个字符在实际编程中,最常用的是字符串。在中是在实际编程中,最常用的是字符串。在中是在实际编程中,最常用的是字符串。在中是在实际编程中,最常用的是字符串。在中是用字符数组存放字符串。字符串以用字符数组存放字符串。字符串以用字符数组存放字符串。字符串以用字符数组存放字符串。字符串以 00 作为作为作为作为串结束符,因此当把字符串存入数组时,也把串结束符,因此当把字符串存入数组时,也把串结束符,因此当把字符串存入数组时,也把串结束符,因此当把字符串存入数组时,也把 00 存入数组,并以此作为该字符串是否存入数组,并以此作为该字符串是否存入数组,并以此作为该字符串是否存入数组,并以此作为该字符串是否结束的标志。结束的标志。结束的标志。结束的标志。程序中通过循环扫描字符数组元素,读到程序中通过循环扫描字符数组元素,读到程序中通过循环扫描字符数组元素,读到程序中通过循环扫描字符数组元素,读到 00 时候便认为字符串结束。时候便认为字符串结束。时候便认为字符串结束。时候便认为字符串结束。(三)字符数组(三)字符数组字符串和字符串结束标志字符串和字符串结束标志用字符串方式赋值比用字符逐个赋值要多占一用字符串方式赋值比用字符逐个赋值要多占一用字符串方式赋值比用字符逐个赋值要多占一用字符串方式赋值比用字符逐个赋值要多占一个字节,个字节,个字节,个字节,用于存放字符串结束标志用于存放字符串结束标志用于存放字符串结束标志用于存放字符串结束标志 00。例如:数组例如:数组例如:数组例如:数组char c=“c program”char c=“c program”在内存在内存在内存在内存中的实际存放情况为:中的实际存放情况为:中的实际存放情况为:中的实际存放情况为:(三)字符数组(三)字符数组字符串和字符串结束标志字符串和字符串结束标志00是由是由是由是由C C编译系统自动加上的。由于采编译系统自动加上的。由于采编译系统自动加上的。由于采编译系统自动加上的。由于采用了用了用了用了00标志,所以在用字符串赋初值时标志,所以在用字符串赋初值时标志,所以在用字符串赋初值时标志,所以在用字符串赋初值时一般无须指定数组的长度,一般无须指定数组的长度,一般无须指定数组的长度,一般无须指定数组的长度,而由系统自行而由系统自行而由系统自行而由系统自行处理。处理。处理。处理。char cchar c=China;=China;printf(%sprintf(%s,c);c);例如例如在内存中数组在内存中数组c c的状态的状态(三)字符数组(三)字符数组字符数组的输入输出字符数组的输入输出字符数组的输入输出可以有两种方式:字符数组的输入输出可以有两种方式:N逐个字符输入输出。用逐个字符输入输出。用”%c”输入或输出一个输入或输出一个字符字符N将整个字符串一次输出。用将整个字符串一次输出。用“%s”格式符,格式符,charc=“China”;printf(“%s”,c);China0China(三)字符数组(三)字符数组字符数组的输入输出字符数组的输入输出注意:注意:N输出字符不包括结束符输出字符不包括结束符0;N用用“%s”格式符输出字符串时,格式符输出字符串时,printf函数中的函数中的输出项时字符数组名,而不是数组元素名。输出项时字符数组名,而不是数组元素名。printf(“%s”,c);N如果数组长度大于字符串实际长度,也只输出如果数组长度大于字符串实际长度,也只输出遇遇0结束结束N如果一个字符数组中包含一个以上如果一个字符数组中包含一个以上0,则遇,则遇到第一个到第一个0时结束。时结束。#include void main()char st15;printf(input string:n);scanf(%s,st);printf(%sn,st);(三)字符数组(三)字符数组字符数组的输入输出字符数组的输入输出本例中由于定义数组长度为本例中由于定义数组长度为15,因此输入的字符串长度必因此输入的字符串长度必须小于须小于15,以留出一个字节用,以留出一个字节用于存放字符串结束标志于存放字符串结束标志0。对于字符数组,如果不作初始对于字符数组,如果不作初始化赋值,则须说明数组长度。化赋值,则须说明数组长度。应该特别注意的是,当用应该特别注意的是,当用scanf函数输入字符串时,字函数输入字符串时,字符串中不能含有空格,否则符串中不能含有空格,否则将将以空格作为串的结束符以空格作为串的结束符。例如运行上例,当输入的字符例如运行上例,当输入的字符串中含有空格时,运行情况为:串中含有空格时,运行情况为:(三)字符数组(三)字符数组字符数组的输入输出字符数组的输入输出#includevoidmain()charst16,st26,st36,st46;printf(inputstring:n);scanf(%s%s%s%s,st1,st2,st3,st4);printf(%s%s%s%sn,st1,st2,st3,st4);从输出结果可以看出空格以后的字符都未能输出。从输出结果可以看出空格以后的字符都未能输出。为为了避免这种情况,了避免这种情况,可可多设几个字符数组分段存放含空格多设几个字符数组分段存放含空格的串的串。程序可改写如下:。程序可改写如下:(三)字符数组(三)字符数组字符数组的输入输出字符数组的输入输出重要一点:重要一点:在前面介绍过在前面介绍过scanf的各输入项必须的各输入项必须以地址方式出现,如以地址方式出现,如&a,&b等。等。但在上例中却是以数组名方式出现但在上例中却是以数组名方式出现的,这是为什么呢的,这是为什么呢?这是由于在这是由于在语言中规定,语言中规定,数组名就代表了该数数组名就代表了该数组的首地址。组的首地址。(三)字符数组(三)字符数组字符串处理函数字符串处理函数语言提供了丰富的字符串处理函数,大语言提供了丰富的字符串处理函数,大致可分为字符串的输入、输出、合并、致可分为字符串的输入、输出、合并、修改、转换、复制、搜索几类。用于输修改、转换、复制、搜索几类。用于输入输出的字符串函数,入输出的字符串函数,在使用前应包在使用前应包含头文件含头文件stdio.h;使用其它字符串;使用其它字符串函数则应包含头文件函数则应包含头文件string.h。下面介绍几个最常用的字符串函数。下面介绍几个最常用的字符串函数。(三)字符数组(三)字符数组字符串处理函数字符串处理函数格式:格式:puts(字符数组名字符数组名)功能:功能:把字符数组中的字符串输出到显示器。把字符数组中的字符串输出到显示器。即在屏幕即在屏幕上显示该字符串。上显示该字符串。#includevoidmain()staticcharc=BASICndBASE;puts(c);从程序中可以看出从程序中可以看出puts函数中可以使用转义字符,函数中可以使用转义字符,因因此输出结果成为两行。此输出结果成为两行。puts函数完全可以由函数完全可以由printf函数取代。当需要按一定格式输出时,通常使用函数取代。当需要按一定格式输出时,通常使用printf函数。函数。字符串输出函数 puts(三)字符数组(三)字符数组字符串处理函数字符串处理函数格式:格式:gets(字符数组名字符数组名)功能:功能:从标准输入设备键盘上输入一个字符串。从标准输入设备键盘上输入一个字符串。本本函数得到一个函数值,即为该字符数组的首地址。函数得到一个函数值,即为该字符数组的首地址。#includestdio.h“voidmain()charst15;printf(inputstring:n);gets(st);puts(st);可以看出当输入的字符串中含有空格时,输可以看出当输入的字符串中含有空格时,输出仍为全部字符串。说明出仍为全部字符串。说明gets函数并不以函数并不以空格作为字符串输入结束的标志,而只以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是与回车作为输入结束。这是与scanf函数不函数不同的。同的。字符串输入函数gets3.strcat3.strcat函数函数其一般形式为其一般形式为:strcat(strcat(字符数组字符数组1 1,字符数组,字符数组2)2)strcat的作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值字符数组1的地址。(三)字符数组(三)字符数组字符串处理函数字符串处理函数例如:例如:char str130=Peoples Republic of ;char str2char str2=China;=China;print(%sprint(%s,strcat(str1strcat(str1,str2);str2);输出:Peoples Republic of ChinaPeoples Republic of China 4.strcpy函数函数 其一般形式为其一般形式为:strcpy(字符数组字符数组1,字符串,字符串2)strcpy是“字符串复制函数”。作用是将字符串2复制到字符数组1中去。例如:char str1char str11010,str2str2=China;=China;strcpy(str1,str2);1.1.1.1.字符数组字符数组1 1必须定义得足够大,以便容纳被复制的必须定义得足够大,以便容纳被复制的字符串。字符数组字符串。字符数组1 1的长度不应小于字符串的长度不应小于字符串2 2的长度。的长度。2.2.2.2.“字字符符数数组组1 1”必必须须写写成成数数组组名名形形式式(如如str1)str1),“字字符符串串2 2”可可以以是是字字符符数数组组名名,也也可可以以是是一一个个字字符符串串常量。如常量。如strcpy(str1strcpy(str1,ChinaChina);3.3.3.3.复复制制时时连连同同字字符符串串后后面面的的0 0一一起起复复制制到到字字符符数数组组1 1中。中。4.4.4.4.可可以以用用strcpystrcpy函函数数将将字字符符串串2 2中中前前面面若若干干个个字字符符复复制到字符数制到字符数组组1 1中去。例如中去。例如:strcpy(str1:strcpy(str1,str2str2,2);2);作作用用是是将将str2str2中中前前面面2 2个个字字符符复复制制到到str1str1中中去去,然然后后再加一个再加一个 0 0。5.5.5.5.不不能能用用赋赋值值语语句句将将一一个个字字符符串串常常量量或或字字符符数数组组直直接接给一个字符数组。如下面两行都是不合法的:给一个字符数组。如下面两行都是不合法的:char str110,str210;char str110,str210;str1=China;str1=str2;str1=China;str1=str2;str1=China;str1=str2;str1=China;str1=str2;而而只只能能用用strcpystrcpy函函数数将将一一个个字字符符串串复复制制到到另另一一个个字字符符数组中去。用赋值语句只能将一个字符赋给一数组中去。用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。如下面是合法的:个字符型变量或字符数组元素。如下面是合法的:char achar achar achar a5 5 5 5,c1c1c1c1,c2;c2;c2;c2;c1=A;c2=B;c1=A;c2=B;c1=A;c2=B;c1=A;c2=B;a a a a0 0 0 0=C;a=C;a=C;a=C;a1 1 1 1=h;a=h;a=h;a=h;a2 2 2 2=i;=i;=i;=i;a a a a3 3 3 3=n;a=n;a=n;a=n;a4 4 4 4=a;=a;=a;=a;(三)字符数组(三)字符数组字符串处理函数字符串处理函数测字符串长度函数strlen格式格式:strlen(字符数组名字符数组名)功能:功能:测字符串的实际长度测字符串的实际长度(不含字符串结束标志不含字符串结束标志0)并作为函数返回值。并作为函数返回值。#includestring.h“#include“stdio.h”voidmain()intk;charst=Clanguage;k=strlen(st);printf(Thelenthofthestringis%dn,k);Strlen()Strlen()与与sizeof()sizeof()的区别的区别 将字符数组定义为一个字符将字符数组定义为一个字符将字符数组定义为一个字符将字符数组定义为一个字符 混淆混淆混淆混淆cc和和和和”c”c”的意义的意义的意义的意义 字符数组整体输入时用取地址符号是不对的字符数组整体输入时用取地址符号是不对的字符数组整体输入时用取地址符号是不对的字符数组整体输入时用取地址符号是不对的 在实际应用中,字符数组,在使用前先格式在实际应用中,字符数组,在使用前先格式在实际应用中,字符数组,在使用前先格式在实际应用中,字符数组,在使用前先格式化。调用函数化。调用函数化。调用函数化。调用函数memset.memset.char a100;char a100;memset(a,0,sizeof(a);memset(a,0,sizeof(a);字符数组可以通过数组名进行整体引用字符数组可以通过数组名进行整体引用字符数组可以通过数组名进行整体引用字符数组可以通过数组名进行整体引用 C C语言没有字符串类型数据,字符串的操作通语言没有字符串类型数据,字符串的操作通语言没有字符串类型数据,字符串的操作通语言没有字符串类型数据,字符串的操作通过一维字符数组实现过一维字符数组实现过一维字符数组实现过一维字符数组实现 C C语言规定以语言规定以语言规定以语言规定以00作为字符串结束标志作为字符串结束标志作为字符串结束标志作为字符串结束标志 字符数组的输入输出分别可使用字符数组的输入输出分别可使用字符数组的输入输出分别可使用字符数组的输入输出分别可使用getchar()/scanf()/getsgetchar()/scanf()/gets()()和和和和putchar()/printf()/puts()putchar()/printf()/puts()%c%s%c%s1.数组是程序设计中最常用的数据结构。数组可分为数数组是程序设计中最常用的数据结构。数组可分为数值数组值数组(整数组,实数组整数组,实数组),字符数组以及后面将要介,字符数组以及后面将要介绍的指针数组,结构数组等。绍的指针数组,结构数组等。2.数组可以是一维的,二维的或多维的。数组可以是一维的,二维的或多维的。3.数组类型说明由类型说明符、数组名、数组长度数组类型说明由类型说明符、数组名、数组长度(数数组元素个数组元素个数)三部分组成。数组元素又称为下标变量。三部分组成。数组元素又称为下标变量。数组的