C语言数组详解_第1页
C语言数组详解_第2页
C语言数组详解_第3页
C语言数组详解_第4页
C语言数组详解_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数组,什么是数组?,就是一组具有固定数目的、有序的、类型相同的数据的集合。根据数组下标的多少,数组可以分为一维数组和多维数组。,例如:一个班级有30个学生,可以用g1,g2,g30代表学生的成绩,其中g是数组名,下标代表学生的序号。由于在C语言中无法表示下标,所以就引入了 表示下标。 g1:第1个学生的成绩 gi:第i个学生的成绩等等,为标识数组中的每个元素,C语言对其进行编号。这个编号称之为数组元素下标。(C语言规定下标从0开始)。,指定该数组的数据个数,用于访问的、具有相同的数据类型。在程序设计中相当于变量名的用法。,一个数组就是一组连续的内存空间,用来保存 数据,数组中的每一项称为一个元

2、素。,(一)一维数组(1)定义及使用,类型说明符 数组名常量表达式 int a10,任一种基本数据类型或构造数据类型。,用户自定义的数组名字,其定名规则与变量名定名规则一样,都需遵循标识符定名规则,表示元素的个数,即数组长度。,下标运算符 单目运算符 优先级(1) 左结合 不能用( ),注意: 1.数组名不能与其它变量名相同,void main() int a; float a10; ,(一)一维数组(1)定义及使用,2. 不能在方括号中用变量来表示元素的个数,但可以是符号常数或常量表达式。, int n; scanf(%d,#define FD 5 void main() int a3+2,

3、b7+FD; ,(一)一维数组(1)定义及使用,3. 方括号中常量表达式表示数组元素的个数。如int a5: 数组a有5个元素,其下标从0开始,分别为a0,a1,a2,a3,a4。,4.允许在同一个类型说明中说明多个数组和多个变量。 例如: int a,b,c,d,k110,k220;,如果出现数组越界,编译系统没有提示的。,(一)一维数组(1)定义及使用,数组必须先定义,然后使用。 数组元素的表示形式为: 数组名下标 C语言规定只能逐个引用数组元素而不能一次引用整个数组。,可以是整型常量或整型表达式,(一)一维数组(2)引用,全部初始化 部分初始化 使用输入函数scanf初始化 使用表达式赋

4、值,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,int a10=0,1,2,3;,a4=a3+2;,对全部数组元素赋初值时,数组长度可以省略,(一)一维数组(3)初始化,一维数组元素的存储方式,int a5 = 1,2,3,4,5;,一维数

5、组元素的存储方式,#include void main() int a5=0,1,2,3,4; for(int i=0;i5;i+) printf(a%d=%d,其地址是%dn,i,ai, ,数组名表示数组的起始地址,是一个地址常量,程序举例1:用选择排序法进行排序。,选择排序法是编程中经常用的一种排序算法。具体如下: 先将5个数中最小的数与a0对换,再将a1到a4中最小的数与a1对换,这样每比较一轮,找出一个未经排序的数中最小的一个。共比较4轮。,int a5 = 3,6,1,9,4;, 1.4一维数组程序举例,a0 a1 a2 a3 a4 3 6 1 9 4 未排序的情况 1 6 3 9

6、4 将5个数中最小的数1与 a0对换 1 3 6 9 4 将余下的4个数中最小的数 3与a1 对换 1 3 4 9 6 将余下的3个数中最小的数 4与a2 对换 1 3 4 6 9 将余下的2个数中最小的数 6与 a3 对换,main() int i,j,k,t; int a5 = 3,6,1,9,4; for( i = 0; i sizeof(a)/sizeof(int) 1; i+) k = i; for( j = i + 1; j sizeof(a); j+ ) if(aj ak ) k = j; if( k != i ) t = ai; ai = ak; ak = t; ,容易出错的地

7、方,数组的起始下标、最后一个元素的下标 定义数组时不指定长度(动态数组) 对数值型数组进行整体操作 用scanf语句时,数组元素前应加,小结,一维数组的定义、初始化、引用、输入、输出概念、操作必须掌握 数组中的所有元素,数据类型都一致 数组名字代表数组的首地址,是一个常量 数组元素具有和相同单个变量一样的属性,凡允许使用单个变量的地方均可以使用数组元素,(二)二维数组定义及使用,这儿只讨论二维数组,多维数组可由二维数组推导得出,二维数组定义的一般形式为: 类型说明符 数组名常量表达式常量表达式,第一常量表达式为行数,第二个为列数,int a34;,float a3,4,b5,10; /*错误*

8、/,二维数组中的元素在内存中的排列顺序是:按行存放,即先顺序存放第一行的元素,再存放第二行的元素,二维数组在内存中的存放,下图表示对a34数组存放的顺序,int a23=1,2,3,4,5,6;,(二)二维数组存储方式,#include void main() int a23=1,2,3,4,5,6,i,j; for(i=0;i2;i+) for(j=0;j3;j+) printf(第a%d%d元素=%d,其地址为:%dn,i,j,aij, ,(二)二维数组引用,二维数组的表示形式:数组名下标下标,注意: 下标可以是整型表达式,如a2-12*2-1 数组元素可以出现在表达式中,也可以被赋值 b

9、12=a23/2; 在使用数组元素时,应该注意下标值应在已定义的数组大小范围内 int a34; a34=5; 严格区分在定义数组时用的a34和引用元素时的a34,全部初始化 部分初始化 使用输入函数scanf初始化,int a23=0,1,2,3,4,5; int a23=0,1,2,3,4,5;,a00=0; a01=1; a02=2; a10=3; a11=4; a12=5;,int a23=0,1,2; 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

10、;j3;j+) scanf(%d,对全部数组元素赋初值时,第一维的长度可以省略,(二)二维数组初始化,(二)二维数组程序举例,例3:一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。,(二)二维数组程序举例,例3:一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。,#include #define N 3 #define M 5 void main() float scoreNM,avg1=0,avgN,sumN=0; int i,j; for(i=0;iN;i+) for(j=0;jM;j+) printf(第%d门课,

11、第%d个学生的成绩:,i,j); scanf(%f, ,小结,二维数组在内存中是按行存放 数组元素的下标每一维都是从0开始的 数值型数组不能够整体引用 可以把二维数组看成是一个特殊的一维数组,即其元素是一个一维数组 二维数组初始化有两种方法:按行赋值或者一行赋值,(三)字符数组定义,字符数组:用来存放字符数据的数组就是字符数组。 定义方式:char 数组名长度,一维数组:char a10; 二维数组: char a45;,(三)字符数组初始化,对字符数组初始化,最容易理解的方式是逐个字符赋给数组中各元素。如: Char c10= I, ,a,m, ,h,a, p,p,y;,如果在定义字符数组时

12、不进行初始化,则数组中各元素的值是不可预料的。,如果花括弧中提供的初值个数(即字符个数)大于数组长度,则按语法错误处理。,注意:,char c=I, ,a,m, ,h, a,p,p,y;数组c的长度自动定为10。,#include void main() char c10=I, ,a,m, ,a, ,b,o,y; int i; for (i=0;i10;i+) printf (“%c”,ci); printf(“n”); ,(三)字符数组引用,可以引用字符数组中的一个元素,得到一个字符,在实际编程中,最常用的是字符串。在中是用字符数组存放字符串。字符串以0作为串结束符,因此当把字符串存入数组时

13、,也把0 存入数组,并以此作为该字符串是否结束的标志。 程序中通过循环扫描字符数组元素,读到0 时候便认为字符串结束。,(三)字符数组字符串和字符串结束标志,用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志0。 例如:数组char c = “c program”在内存中的实际存放情况为:,(三)字符数组字符串和字符串结束标志,0是由C编译系统自动加上的。由于采用了0标志,所以在用字符串赋初值时一般无须指定数组的长度, 而由系统自行处理。,在内存中数组c的状态,(三)字符数组字符数组的输入输出,字符数组的输入输出可以有两种方式: 逐个字符输入输出。用”%c”输入或输出一个

14、字符 将整个字符串一次输出。用“%s”格式符,,char c=“China”; printf(“%s”,c);,China,(三)字符数组字符数组的输入输出,注意: 输出字符不包括结束符0; 用“%s”格式符输出字符串时,printf函数中的输出项时字符数组名,而不是数组元素名。 printf(“%s”,c); 如果数组长度大于字符串实际长度,也只输出遇0结束 如果一个字符数组中包含一个以上0 ,则遇到第一个0时结束。,#include void main() char st15; printf(input string:n); scanf(%s,st); printf(%sn,st); ,(

15、三)字符数组字符数组的输入输出,本例中由于定义数组长度为15, 因此输入的字符串长度必须小于15,以留出一个字节用于存放字符串结束标志0。 对于字符数组,如果不作初始化赋值,则须说明数组长度。 应该特别注意的是,当用scanf函数输入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符。例如运行上例,当输入的字符串中含有空格时,运行情况为:,(三)字符数组字符数组的输入输出,#include void main() char st16,st26,st36,st46; printf(input string:n); scanf(%s%s%s%s,st1,st2,st3,st4); prin

16、tf(%s %s %s %sn,st1,st2,st3,st4); ,从输出结果可以看出空格以后的字符都未能输出。 为了避免这种情况, 可多设几个字符数组分段存放含空格的串。程序可改写如下:,(三)字符数组字符数组的输入输出,重要一点: 在前面介绍过scanf的各输入项必须以地址方式出现,如 puts(c); ,从程序中可以看出puts函数中可以使用转义字符, 因此输出结果成为两行。puts函数完全可以由printf函数取代。当需要按一定格式输出时,通常使用printf函数。,字符串输出函数 puts,(三)字符数组字符串处理函数,格式: gets (字符数组名),功能:从标准输入设备键盘上输

17、入一个字符串。 本函数得到一个函数值,即为该字符数组的首地址。,#includestdio.h“ void main() char st15; printf(input string:n); gets(st); puts(st); ,可以看出当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的。,字符串输入函数gets,3. strcat函数 其一般形式为:strcat(字符数组1,字符数组2) strcat的作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函

18、数调用后得到一个函数值字符数组1的地址。,(三)字符数组字符串处理函数,例如: char str130=Peoples Republic of ; char str2=China; print(%s,strcat(str1,str2); 输出:Peoples Republic of China,4. strcpy函数 其一般形式为:strcpy(字符数组1,字符串2) strcpy是“字符串复制函数”。作用是将字符串2复制到字符数组1中去。例如: char str110,str2=China; strcpy(str1,str2);,1.字符数组1必须定义得足够大,以便容纳被复制的字符串。字符数

19、组1的长度不应小于字符串2的长度。,2.“字符数组1”必须写成数组名形式(如str1),“字符串2”可以是字符数组名,也可以是一个字符串常量。如strcpy(str1,China);,3.复制时连同字符串后面的0一起复制到字符数组1中。,4.可以用strcpy函数将字符串2中前面若干个字符复制到字符数组1中去。例如:strcpy(str1,str2,2); 作用是将str2中前面2个字符复制到str1中去,然后再加一个0。,5.不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。如下面两行都是不合法的: char str110,str210; str1=China; str1=str2

20、; 而只能用strcpy函数将一个字符串复制到另一个字符数组中去。用赋值语句只能将一个字符赋给一 个字符型变量或字符数组元素。如下面是合法的: char a5,c1,c2; c1=A; c2=B; a0=C; a1=h; a2=i; a3=n; a4=a;,(三)字符数组字符串处理函数,测字符串长度函数strlen,格式: strlen(字符数组名),功能:测字符串的实际长度(不含字符串结束标志0) 并作为函数返回值。,#includestring.h“ #include “stdio.h” void main() int k; char st=C language; k=strlen(st); printf (The lenth of the string is %dn,k); ,Strlen()与sizeof()的区别,容易出错的地方,将字符数组定义为一个字符 混淆c和”c”的意义 字符数组整体输入时用取地址符号是不对的 在实际应用中,字符数组,在使用前先格式化。调用函数memset. char a100; memset( a, 0, sizeof(a);,小结,字符数组可以通过数组名进行整体引用 C语言没有字符串类型数据,字符串的操作通过一维字符数组实现 C语言规定以0作为字符串结束标志 字符数组的输入

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论