C语言程序设计课件07 数组_第1页
C语言程序设计课件07 数组_第2页
C语言程序设计课件07 数组_第3页
C语言程序设计课件07 数组_第4页
C语言程序设计课件07 数组_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

第七章数组本章主要内容一维数组定义和数组元素的引用一维数组与指针运算二维数组的定义和数组元素的引用二维数组与指针运算动态数组的使用7.1一维数组的定义及使用

一维数组的定义一维数组的引用一维数组的初始化7.1.1一维数组的定义数组的概念数组是具有相同的数据类型且按一定次序排列的一组变量的集合体,数组属于构造类型。intgrades[6];一维数组构成一个数组的这些变量称为数组元素数组有一个统一的名字叫数组名。grades1009186537865一个成绩单列表一维数组的定义类型说明符

数组名[常量表达式

];

例如:inta[10];

表示a

为整型数组,有10个元素:

a[0]...a[9]可以是常量和符号常量,不能用变量。数组名的构成方法与一般变量名相同。一维数组数组长度下标:0~(数组长度–1)一维数组数组元素在内存中顺次存放,它们的

地址是连续的。数组grades存储grades所需要的存储空间(24位)agradeagradeagradeagradeagradeagradegrades的逻辑存储方式数组gradesgrades[5]grades[0]grades[1]grades[2]grades[3]grades[4]第1个数组元素第2个数组元素第3个数组元素第4个数组元素第5个数组元素第6个数组元素grades的物理存储方式一维数组grades[0]grades[1]grades[2]grades[3]grades[4]grades[5]数组名标识了数组的起始位置起点从数组的起始位置越过4个元素到达grades[4]获取grades[4]示意图数组元素的下标从0开始。一维数组引用必须先定义,后使用。只能逐个引用数组元素,而不能一次引用整个数组。

例如:a[0]=a[5]+a[7]-a[2*3]数组元素是一个变量。例如:price[3]=20.23;

scanf(“%d%f”,&grade[2],&price[0]);引用时,数组元素的下标,可以是常量、变量或表达式,但其值应为非负整型。例:grade[1] grade[2*i] grade[j-1]一维数组total=grade[0]+grade[1]+grade[2]+grade[3]+grade[4]total=0;for(i=0;i<=4;++i) total=total+grade[i];i<5intgrade[5];#defineNUMELS5100?NUMELS

i<NUMELS

100800一维数组#include<stdio.h>intmain(){inti,grades[5];

for(i=0;i<=4;++i)/*Enterfivegrades*/{printf("Enteragrade:");scanf("%d",&grades[i]);}for(i=0;i<=4;++i)/*Printfivegrades*/printf("\ngrades%dis%d",i,grades[i]);

return0;}longtotal=0;total=total+grades[i];printf("\nTotalis%ld.\n",total);一维数组的初始化初始化,即赋初值。C语言允许定义数组时直接对数组进行初始化。一般形式: 类型说明符数组名[常量表达式]={数值表};

举例:

floatvar[8]={0.1,1.2,2.6,3.5,

4.3,5.5,3.5,5.5}; int a[5]={2,3,4,5,6};初始化时,各元素的值要顺序放在一对花括号里面,各元素值之间用逗号间隔。一维数组的初始化若定义时无初始化,C语言将为数值型数组元素自动初始化为0。

例如:intgrades[5];当花括号中的数值表中的数据个数少于数组定义中的元素个数时,C语言将这些数据分别赋给数组的前几个元素,其余数组元素自动被初始化为0。

例如:intgrades[5]={82,70};一维数组的初始化当对全部数组元素赋初值时,可省略数组长度。

例如:

floatvar[]={0.1,1.2,2.6,3.5,

4.3,5.5,3.5,5.5};

int a[]={2,3,4,5,6};

系统将认为数组的元素个数就是后面初始化时所提供的数据的个数。floatvar[8]={0.1,1.2,2.6,3.5,

4.3,5.5,3.5,5.5};int a[5]={2,3,4,5,6};一维数组的初始化静态数组的定义方式:static类型说明符数组名[常量表达式];可以只给数组的前若干个元素赋初值,此时后面的元素均将自动赋以初值0。

staticinta[10]={1,2,3,4};需要指出的是,静态存储的数组在对程序进行编译连接的时候就给予分配存储空间,并进行赋初值。而程序中说明的动态数组是在运行时才分配存储空间,并且,其中各元素的初值是任意的。7.2一维数组与指针运算

一维数组的数组名一维数组的下标与指针作为函数参数的一维数组的数组名一维数组的数组名先看以下两个定义:intsum;intnum[5];变量sum是一个标量,因为它是一个单一的值且这个数值是整型的。变量num是一个数组,因为它是一组值的集合。当数组名和下标值一起使用,就可以标识数组中某个特定的值。num[2]的类型是整型数据,那么num的类型又是什么呢?它所表示的又是什么呢?

在C语言中,在几乎所有使用数组名的表达式中,数组名的值是一个指针常量,也就是数组中第一个数组元素的地址。num的类型取决于数组元素的类型,数组元素的类型是int类型,那么num的类型就是“指向int的常量指针”。因此一维数组的数组名表示的是该数组中第一个数组元素的存储地址,数组名的类型是“指向数组元素存储类型的常量指针”。请不要将数组等同于指针,因为数组具有一些和指针完全不同的特征。数组名是一个指针常量,而不是指针变量,因此数组名的值是不能修改的。一维数组的下标与指针现有语句intnum[5];那么*(num+2)表示什么呢?

先分析num+2所表示的含义:num的值是一个指向整型的指针,所加的2表示数组num第一个元素向后移动2个整型长度的运算,换句话说,num+2表示以数组num的第一个元素为基准,向后移动2个数组元素的长度后所指向的数组元素的存储地址,也就是说这个2可以看作是偏移量。再通过间接访问操作访问这个新的存储空间取得这个存储空间中所存储的数据。这个过程看上去很熟悉,因为这和前面的数组下标的引用过程完全一样的。因此num[2]和*(num+2)是等价的。请牢记在C语言中下标引用和间接访问表达式是一样的。#defineN10 ……intarray[N];int*ptr=array+5;数组作函数参数时的指针表示将一维数组名作为函数参数传送时被传递的是数组第0个元素的地址,被调用函数中接收这个地址的形参应是一个存放该地址的变量,也就是指针变量。(1)实参与形参都用数组名。例如,intmain()定义Output()函数:{intarray[10];voidOutput(intp[],intn)…{Output(array,10);… …return0;}}形参intp[]表示p所指向对象的指针变量,intp[]等价于int*p。(2)实参用数组名,形参用指针变量。例如,intmain()定义Output()函数:{intarray[10];voidOutput(int*p,intn)…{Output(array,10);……return0;}}函数开始执行时,p指向array[0],即p=&array[0]。通过p值的改变,可以指向数组array中的任一元素。(3)实参与形参都用指针变量。例如,intmain()定义Output()函数:{intarray[10],*ptr=array;voidOutput(int*p,intn) …{Output(ptr,10);……return0;}}

如果实参用指针变量,则这个指针变量必须有一个确定的值。先使实参指针变量ptr指向数组array,ptr的值是&array[0],然后将ptr的值传给形参指针变量p,p的初始值也是&array[0]。通过p值的改变可以使p指向数组array的任一元素。(4)实参用指针变量,形参用数组名。例如,intmain()定义Output函数:{intarray[10],*ptr=array;voidOutput(intp[],intn) …{Output(ptr,10);… …return0;}}实参ptr为指针变量,它使指针变量ptr指向数组array。形参为数组名p,实际上将p作为指针变量处理,可以理解为形参数组p和array数组共用同一段内存单元。在函数执行过程中可以使p[i]的值变化,而它也就是array[i]。7.3二维数组的定义及使用

二维数组的定义二维数组元素的引用二维数组的初始化二维数组二维数组定义的一般形式:

数据类型名

数组名[常量表达式1][常量表达式2];

例如:

double a[3][3],b[2][2]; int f[2][3];同一维数组一样,二维数组(或多维数组)中行、列下标的值也都是从0开始的。二维数组可以看成是一个特殊的一维数组,只是这个一维数组的每一个元素又是一个一维数组。二维数组二维数组二维数组中各元素的顺序遵照按行存放的原则。例如,定义一个二维数组a[3][3]后,其中的元素a[0][2]在内存中被存放在元素a[1][0]之前。

345存储单元3a[0][0]a=678对应表:4a[0][1]129→5a[0][2]6a[1][0]7a[1][1]8a[1][2]1a[2][0]2a[2][1]9a[2][2]

二维数组可以计算数组元素在数组中的序号假设m×n的数组a,

计算a[i][j]序号的公式:i×n+j

如:a为3×3的数组,则

a[0][1]0×3+1=1a[1][2]的序号是:1×3+2=5a[2][2]2×3+2=8例:若数组a有m列,则a[i][j]之前的数组元素个数为

A、(i-1)*(j-1)B、i*m+j+1C、i*m+j-1D、i*m+j答案:D多维数组多维数组定义的一般形式:

数据类型名 数组名[常量表达式1][常量表达式2]……[常量表达式n];举例:

inta[3][3][3];多维数组多维数组中的元素在内存中的存放顺序为按行存放,即最左边的下标变化最慢,最右边的下标变化最快。注意:二维数组的几点说明对多维数组同样适用!二维数组的引用引用的一般形式:P126

数组名[下标表达式1][下标表达式2]例如:

f[2][2],f[2*4][3],f[2+1][4%2]

下标表达式的值必须是一个整型的量,可以是整型常量、整型变量或者结果为整型的表达式。说明:二维数组中的元素地址可表示为:

&数组名[下标表达式1][下标表达式2]可以把二维数组或多维数组中的元素看成是普通的变量。基本数据类型的变量所能进行的各种操作,同样适用于二维数组或多维数组中的元素。例如:

f[2][3]=f[2][2]/2+1; f[2][2]=f[1][2]*f[2][1];二维数组的初始化方法1:直接赋初值。适用于数据较少时。将数组元素的所有初始值都写在一个花括号内,由编译系统按照数组元素在内存中存放的顺序对各元素赋初值。例如:

intnum[3][4]={11,2,23,4,51,6,

7,8,92,10,0,12};方法2:分行为二维数组赋值。适用于每一行的初始值个数少于每一行中的数组元素个数时。例如:intnum[3][4]={{11,2},

{51,6,7},

{92,10,0,12}};每一行中后面的剩余元素被自动赋值为0!二维数组的长度不能随意省略,必须遵守如下规则:使用第一种方式,只有当为二维数组的所有元素赋初值时,所定义数组的第一维的长度才可以省略。例如:

intnum[][4]={11,2,0,0,51,

6,7,0,92,10,0,12};使用第二种方式,无论是为二维数组的所有元素赋初值,还是为二维数组的部分元素赋初值,定义数组时都可以省略第一维的长度。无论采用上述哪一种方式为二维数组元素赋初值,在定义数组时第二维的长度都绝对不可以省略。例:若有说明:inta[][4]={1,2,3,4,5,6,7,8,9},则数组第一维的大小为。

A、2B、3C、4D、不确定的值答案:B二维数组二维数组#include<stdio.h>intmain(){intval[3][4]={8,16,9,52,3,15,27,6,14,25,2,10};voiddisplay(intnums[3][4]);/*functionprototype*/display(val);return0;}voiddisplay(intnums[3][4]){introw_num,col_num;for(row_num=0;row_num<3;++row_num){for(col_num=0;col_num<4;++col_num)printf("%4d",nums[row_num][col_num]);printf("\n");}}7.4二维数组与指针运算

二维数组的数组名二维数组的下标与指针作为函数参数的二维数组的数组名二维数组的数组名例如:intmatrix[3][4];该语句创建了matrix,matrix可以看作是一个一维数组,包含了3个元素,只是每个元素恰好是包含4个整型元素的数组。matrix这个名字的值是一个指向它的第一个元素的指针,因此matrix是一个指向包含4个整型元素的数组的指针。二维数组的下标与指针数组名是一个指向第一维第一个元素的

温馨提示

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

评论

0/150

提交评论