您好,欢迎访问三七文档
第4章数组本章学习重点了解数组的概念了解字符串的概念掌握数组的常规操作,定义、引用、初始化掌握数组和字符串的联系和区别掌握使用数组解决简单问题4.1一维数组4.1.1一维数组的定义和引用4.1.2一数组元素的赋值4.1.3一维数组的应用举例4.1.1一维数组的定义和引用当数组中每个数组元素的只有一个下标时,称这种数组为一维数组。数组同变量一样,也必须先定义、后使用。在C语言中,定义一维数组的一般形式为:类型名数组名[常量表达式],……;其中,类型说明符是任一种基本数据类型或构造数据类型。数组名是用户定义的数组标识符。方括号中的常量表达式表示数据元素的个数,也称为数组的长度。一维数组的定义定义方式:数据类型数组名[常量表达式];合法标识符表示元素个数下标从0开始[]:数组运算符单目运算符优先级(1)左结合不能用()例inta[6];a[0]0145a[1]a[2]a[3]a[4]a[5]23a编译时分配连续内存内存字节数=数组维数*sizeof(元素数据类型)数组名表示内存首地址,是地址常量4.1.1一维数组的定义和引用例如:inta[8];在这里,int是类型说明符,a[8]就是一维数组说明符。通过以上语句可以得到以下几点:1.定义了一个名为a的一维数组。2.方括号中的8规定了数组a中有8个数组元素,他们分别是a[0],a[1],a[2],…,a[7]。3.类型名int说明a数组中的8个数组元素都是整型,在每个数组元素中只能存放整型数据。4.每个元素只有一个下标,数组元素的下标是元素相对于数组起始地址的偏移量,在C语言中数组的第一个元素的下标为0,也称为数组下标的下界;数组的下标也有一个上界,也就是最后一个元素的下标,在本例中a数组的最后一个元素的下标为7。5.C语言的编译系统将为a数组在内存中开辟一段连续的存储单元,如图4.1所示。在图中标明了每个存储单元的名字,可以用该名字直接引用每个存储单元。a数组在内存中一共分配了8个int型的存储单元,而每个int型数据占用2个字节,所以,a数组一共占用了16个字节的连续存储单元。6.数组名中存放的是一个地址常量,它代表整个数组的首地址。同一数组中的所有元素,按其下标的顺序占用一段连续的存储单元,如图所示。a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]数组类型说明注意(1)1.数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。例如上例中8个数组元素都是int型的。2.数组名的命名规则应符合标识符的命名规定。3.数组名不能与其它变量名相同。例如:inta;floata[10];这是错误的,定义了整型变量a,就不能又定义一个相同名称的数组变量a[10]。数组类型说明注意(2)4.在方括号中可以用符号常数或常量表达式来表示数组元素的个数,但是不能用变量来表示元素的个数。5.允许在同一个类型说明中,说明多个数组和多个变量,中间用逗号隔开。例如:inta,b,c,x[5],y[8];以上语句定义了3个整型变量a,b,c和2个整型数组x,y,其中x数组包含5个元素,数组上标为4;y数组包含8个元素,数组上标为7。6.数组名后是方括号([],不能用圆括号)。7.方括号中常量表达式表示数组中元素的个数,即数组的长度,例如a[20]表示数组a共有20个元素:a[0],a[1],a[2],…,a[18],a[19]。请注意,元素编号总是从0开始,直到n-l为止,因此,不能使用a[20]。例inti=15;intdata[i];(不能用变量定义数组维数)例intdata[5];data[5]=10;//C语言对数组不作越界检查,使用时要注意一维数组的引用引用数组中的任意一个元素的形式:数组名[下标表达式]例如,若有以下定义语句:doublea[8];则a[0],a[i],a[i+k]都是对数组a中的元素的合法引用形式;其中0,i和i+k称为下标表表达式,由于定义了a数组有8个元素,因此下标表表达式的值必须大于等于0,并且小于8。注意:在数组元素a[i+k]中,i+k只是一个下标表表达式,不能认为是i和k两个下标。数组的引用注意1.“下标表达式”可以是任何非负整型数据,如果为小数时,C编译将自动取整。取值范围是0到n-1(n是元素个数)。在运行C语言程序过程中,系统并不自动检验数组元素的下标是否越界,允许数组下标越界。如果下标表表达式的值越界可能破坏了其他存储单元中的数据,甚至破坏了程序代码。因此在编写程序时,保证数组下标不越界是十分重要的。2.一个数组元素,实质上就是一个变量,它具有和相同类型单个变量一样的属性,可以对它进行赋值和参与各种运算。3.在C语言中,数组作为一个整体,不能参加数据运算,只能对单个的元素进行处理。例如上面定义的数组a,不能用a代表a[0]到a[7]这8个元素。当系统为所定义的数组在内存中开辟一段连续的存储单元时,这些存储单元中并没有确定的值;可以采用以下形式对一维数组进行初始化赋值:例inta[10];printf(“%d”,a);()必须for(j=0;j10;j++)printf(“%d\t”,a[j]);()4.1.2一数组元素的赋值类型名数组名[常量表达式]={初值表}例如:inta[8]={5,4,8,9,2,6,7,1};所赋的初值放在赋值号的后面的一对花括号中,数值型必须与所说明的类型一致,所赋初值之间用逗号隔开,系统将按先后顺序依次将给定的值赋给a[0],a[1],…,a[7]这8个元素。所以a[0]的值为5,a[1]的值为4,a[2]的值为8,…,a[7]的值为1。一维数组的初始化初始化方式在定义数组时,为数组元素赋初值(在编译阶段使之得到初值)inta[5]={1,2,3,4,5};等价于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;说明:数组不初始化,其元素值为随机数对static数组元素不赋初值,系统会自动赋以0值当全部数组元素赋初值时,可不指定数组长度如inta[5]={6,2,3};等价于:a[0]=6;a[1]=2;a[2]=3;a[3]=0;a[4]=0;如inta[3]={6,2,3,5,1};()staticinta[5];等价于:a[0]=0;a[1]=0;a[2]=0;a[3]=0;a[4]=0;只给部分数组元素赋初值inta[]={1,2,3,4,5,6};编译系统根据初值个数确定数组维数数组的初始化注意1.“初值表”中的初值个数,可以少于元素个数,即允许只给部分元素赋初值,后面的元素将自动补初值0。2.如果对数组的全部元素赋以初值,定义时可以不指定数组长度(系统根据初值个数自动确定)。如果被定义数组的长度,与初值个数不同,则数组长度不能省略。3.只能给元素逐个赋值,不能给数组整体赋值。4.如不给可初始化的数组赋初值,则全部元素均为0值。5.为数组中若干元素赋相同初值时,要注意不能随意简化。6.允许以赋值方式为数组各元素赋初值。4.1.3一维数组的应用举例例4-2编一个程序,程序的功能是把数组中的内容逆置。在操作时只能借助一个临时存储单元,不允许另外开辟数组。如:数组中原有的内容为:abcdefg,则内容逆置后,数组中的内容为:gfedcba,同时输出到屏幕。数组a中的原始数据如图4.2所示。内容逆置后数组a中的数据如图4.3所示。aa[0]ba[1]ca[2]da[3]ea[4]fa[5]ga[6]ga[0]fa[1]ea[2]da[3]ca[4]ba[5]aa[6]#defineM7main(){chara[M]={‘a’,’b’,’c’,’d’,’e’,’f’,’g’};/*对数组进行初始化赋值*/inti,n=M-1;chart;printf(数组中原有的内容:);for(i=0;iM;i++)printf(“%c”,a[i]);/*屏幕输出原有内容*/printf(\n);for(i=0;in;i++,n--){t=a[i];a[i]=a[n];a[n]=t;}/*将i位置和n位置的内容进行交换*/printf(数组中逆置后内容:);for(i=0;iM;i++)printf(“%c”,a[i]);/*屏幕输出逆置后的内容*/}例4-3用冒泡法对数组中的10个数进行排序(由小到大)。冒泡法是排序的一种方法,它将两个相邻数进行比较,把小的数调到前面。3849657613273097第一趟38496513273076第二趟384913273065第三趟3813273049第四趟13273038第五趟132730第六趟1327第七趟4938659776132730初始关键字n=838497697979797132730137676762730136565652730134949492730133838382730冒泡排序图示效果forj=0toNUM–i–1输入NUM个数给a[0]到a[NUM-1]fori=1toNUM–1a[j]a[j+1]真假a[j]a[j+1]输出a[0]到a[NUM–1]#includestdio.h#defineNUM10voidmain(){inta[NUM],i,j,t;printf(input%dnumbers:\n,NUM);for(i=0;iNUM;i++)//输入NUM个整数scanf(%d,&a[i]);for(i=1;iNUM;i++)//趟数,共NUM-1趟for(j=0;jNUM-i;j++)//实现一次冒泡操作if(a[j]a[j+1])//交换a[j]和a[j+1]{t=a[j];a[j]=a[j+1];a[j+1]=t;}//输出排好序的数据printf(thesortednumbers:\n);for(i=0;iNUM;i++)printf(%d,a[i]);}运行结果:input10numbers:10127689345↙thesortednumbers:12345678910例4-4请编一个函数fun(int*a,intn,int*odd,int*even),函数的功能是分别求出数组中所有奇数之和以及所有偶数之和。形参n给了数组中数据的个数;利用指针odd返回奇数之和,利用指针even返回偶数这和。例如:数组中的值依次为:1,9,2,3,11,6;则利用指针odd返回奇数之和24;利用指针even返回偶数之和8。#defineN20fun(int*a,intn,int*odd,int*even){inti;*even=0;*odd=0;for(i=0;in;i++)if(!(a[i]%2))/*如果是奇数*/*even+=a[i];/*将数组中该奇数加到奇数之和中*/else*odd+=a[i];/*将数组中该偶数加到偶数之和中*/}main(){inta[N]={1,9,2,3,11,6},i,n=6,odd,even;printf(Theoriginaldatais:\n);for(i=0;in;i++)printf(%4d,*(a+i));/*输出数组中原有的数据*/printf(\n);fun(a,n,&odd,&even);/*调用函数fun,求出奇数之和odd、偶数之和even*/printf(Thesumofoddnumbers:%d\n,odd);printf(Thesumofevennumber:%d\n,even);}例4-5请编写函数fun,对长度为7个字符的字符串,除首、尾字符外,将其余5个字符按降序排列。例如,原来的字符串为CEAedca,排序后输出为CedcEAa。程序代码如下:fun(char*s,intnum){inti,j,t;for(i=1;inum-2;i++)/*除去首尾字符,所以从1开始,到num-
本文标题:第4章_数组
链接地址:https://www.777doc.com/doc-4046660 .html