第7章数组
1 第7章 数组
一个变量对应一个存储区城,用于处理个别的数据。 然而,在程序设计中更多的情况则是要处理成批的数据,如 果仅用单一的变量来处理成批的数据,那是不现实、也是不 方便的。为此,高级程序设计语言都提供一种能方便地表 示和处理成批数据的手段 数组。 数组是存放在一片连续的存储单元中的、有序非空的、 有相同数据类型并有一个名字以供识别的数据集合。这 个集合中的成员称为数组元素。 数组不是简单数据类型,而是一种构造数据类型。本 章将讨论C语言中数组的定义与使用
2 一个变量对应一个存储区域 , 用于处理个别的数据。 然而,在程序设计中更多的情况则是要处理成批的数据,如 果仅用单一的变量来处理成批的数据,那是不现实、也是不 方便的。 为此,高级程序设计语言都提供一种能方便地表 示和处理成批数据的手段 ── 数组。 数组是存放在一片连续的存储单元中的、有序非空的、 有相同数据类型并有一个名字以供识别的数据集合。 这 个集合中的成员称为数组元素。 数组不是简单数据类型,而是一种构造数据类型。本 章将讨论C语言中数组的定义与使用
71一维数组的定义和引用 与使用变量的要求相同,C语言程序中使用数组之前 也必须预先定义数组。 按数组的定义,要定义一个数组必须向编译程序提供 如下信息: a)给数组指定一个名字。 b)规定数组中数据元素的类型; c)指定数组中数据元素的个数 4)规定数组中各元素的表示、存储及排列方式。 所有这些信息都通过如下形式的数组声明语句给出:
3 7.1 一维数组的定义和引用 与使用变量的要求相同,C语言程序中使用数组之前 也必须预先定义数组。 按数组的定义,要定义一个数组必须向编译程序提供 如下信息: a) 给数组指定一个名字。 b) 规定数组中数据元素的类型; c) 指定数组中数据元素的个数; 4) 规定数组中各元素的表示、存储及排列方式。 所有这些信息都通过如下形式的数组声明语句给出:
1、一维教数组的声明格式 存储类型数据类型数组名|e={初始化值表} 其中:“={初始化值表}”,“存储类型”可缺省 e是常量表达式,e的值为所声明的数组包含的元 素个数,也称为数组的大小。无初始化值表时,e不 可缺省;有初始化值表时e可缺省缺省时数组的 元素个数由不是“={初始化值表}”中给出的初始 化数据个数确定。 例 #define size 100 inta[100,b|l={1,2,3} char csize, d 20* SIZE
4 1、一维数组的声明格式 存储类型 数据类型 数组名 [e]= { 初始化值表} ; 其中: “={初始化值表} ” , “存储类型” 可缺省。 e 是常量表达式,e 的值为所声明的数组包含的元 素个数,也称为数组的大小。无初始化值表时,e 不 可缺省;有初始化值表时 e 可缺省,缺省时数组的 元素个数由不是 “={初始化值表}” 中给出的初始 化数据个数确定。 例: #define SIZE 100 int a[100],b[ ] = { 1,2,3 } ; char c[SIZE] , d[20*SIZE] ;
存储类型与数据类型 其作用、意义与变量声明中的含义相同。 数组名 数组的名字按标识符命名规则确定。与变量相同, 也有其作用城。另外,它有两层含义: 第一,在程序中用来标识一个数组及数组元素所 在的数组; 第二,从分配给数组的存储空间的意义上来讲它 总是表示或指向分配给数组的一片连续存储空间的起始 位置,因此它是一个地址量,而且是一个地址常量
5 存储类型与数据类型 其作用、意义与变量声明中的含义相同。 数组名 第二 , 从分配给数组的存储空间的意义上来讲它 总是表示或指向分配给数组的一片连续存储空间的起始 位置,因此它是一个地址量,而且是一个地址常量。 第一 , 在程序中用来标识一个数组及数组元素所 在的数组; 数组的名字按标识符命名规则确定。 与变量相同, 也有其作用域。另外,它有两层含义:
2、一维数组元素的表示、排列与存储 维数组用来表示一维向量,它的每个元素以如下 形式表示 数组名[下标] 其中: 下标”用来指出一个数组元素在一维数组中的 排列序号。一维数组中的每个数组元素要用一个下标来 表示。下标是一个表达式,这样的表达式的值应该是一 个正整数且满足: 0≤下标<数组大小 这就是说,一维数组中元素的序号从0开始,最大序号 为数组元素个数-1
6 2、 一维数组元素的表示、排列与存储 一维数组用来表示一维向量,它的每个元素以如下 形式表示: 数组名[下标] 其中 : “下标” 用来指出一个数组元素在一维数组中的 排列序号。一维数组中的每个数组元素要用一个下标来 表示。下标是一个表达式,这样的表达式的值应该是一 个正整数且满足: 0 ≤ 下标 < 数组大小 这就是说, 一维数组中元素的序号从0开始,最大序号 为数组元素个数-1
也是一种运算符,称为下标运算符,它的操 作数就是下标和数组名。因此“数组名[下标”本身是 个表达式,称为下标表达式,它在对数组元素的访向中 引起对数组元素的下标计算,计算的结果就是要访问的数 组元素在该数组存储区域中的地址。“”运算符与“() 有相同的优先级,优先级最高。 假定有如下的一维数组定义: int x10; 那么组成x数组元素的排列顺序分别是: x[0、x1x[2] 9 而数组x的元素在内存中的存储顺序则是
7 “[ ]” 也是一种运算符, 称为下标运算符,它的操 作数就是下标和数组名。因此 “数组名[下标]” 本身是 一个表达式,称为下标表达式,它在对数组元素的访问中 引起对数组元素的下标计算,计算的结果就是要访问的数 组元素在该数组存储区域中的地址。“[ ]”运算符与“( )” 有相同的优先级,优先级最高。 假定有如下的一维数组定义: int x[10] ; 那么组成x数组元素的排列顺序分别是: x[0]、x[1]、x[2]、.....、x[9] 而数组x的元素在内存中的存储顺序则是:
址 内存储器数组元素 FFOOH x[0 FF02H ⅹ[1 FF04F [2 FF0SH x[3] FFOZH x[4] FFOAH [5] FFOCH x[6 FFOEH ⅹ[7] FF1 0H x[8] FF12H x[9 显然,一维数组元素的排列顺序和它的存储顺序是一致 的。一维数组的第一个元素x0的起始存储地址&x0即 为x所代表的地址。而x1lx[2、…等的起始存储地 址要由数组元素的数据类型来决定。 8
8 显然,一维数组元素的排列顺序和它的存储顺序是一致 的。 一维数组的第一个元素x[0]的起始存储地址&x[0] 即 为x所代表的地址。而 x[1]、x[2]、…… 等的起始存储地 址要由数组元素的数据类型来决定
3、一维数组元素的初始化 与变量类似,C语言也允许在定义数组时给数组中 的元素指定初始值。带有初始化值的数组定义的一般形 式如下: 存储类型数据类型数组名|e={常量表达式表}; 其中:“常量表达式表”由一系列用逗号隔开的常数或 常量表达式组成,列出的常数即是给数组中元素指定的 初始化值。列出的常量顺序就是数组元素在內存中的存 储顺序。例如 intx[10={1,2*2,3,4,5,6,7,8,9,10+1 定义了一个带有初始化值的、具有10个数组元素的整 型数组,各个数组元素具有的值是:x0为1、x1:4 x|2]为3、……x9为11
9 3、一维数组元素的初始化 与变量类似,C语言也允许在定义数组时给数组中 的元素指定初始值。带有初始化值的数组定义的一般形 式如下: 存储类型 数据类型 数组名 [e]={常量表达式表}; 其中: “常量表达式表”由一系列用逗号隔开的常数或 常量表达式组成,列出的常数即是给数组中元素指定的 初始化值。列出的常量顺序就是数组元素在内存中的存 储顺序。例如: int x[10]={ 1 , 2*2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10+1 } ; 定义了一个带有初始化值的、具有10个数组元素的整 型数组,各个数组元素具有的值是: x[0]为 1、x[1]为 4、 x[2] 为 3、 ...... x[9] 为 11
关于一维数组的初始化应注意以下几点: 1)定义带有初始化值的一维数组时可以不指定维的大 小(“[]"中为空但“[]”不能省略),此时维的大小由 给出的初始化值的个数确定。例如: inta]={1,2,3,4,5}; 定义了具有五个元素的一维数组,并且1赋给a0、2 赋给al3赋给a[2等等。 2)给出的初始化数据个数不能多于定义数组的元素个 数。例如: inta5={1,2,3,4,5,6}:(错误) 3)若给出的初始化数据个数少于定义的数组的元素个 数,则剩余的元素被自动初始化成0。例如:
10 关于一维数组的初始化,应注意以下几点: 1) 定义带有初始化值的一维数组时可以不指定维的大 小( “[ ]”中为空,但“[ ]”不能省略),此时维的大小由 给出的初始化值的个数确定。例如: int a[ ] = { 1 , 2 , 3 , 4 , 5 } ; 定义了具有五个元素的一维数组,并且 1 赋给 a[0]、2 赋给 a[1]、3 赋给 a[2] 等等。 2) 给出的初始化数据个数不能多于定义数组的元素个 数。例如: int a[5] = { 1 , 2 , 3 , 4 , 5 , 6 } ;(错误) 3) 若给出的初始化数据个数少于定义的数组的元素个 数,则剩余的元素被自动初始化成0。例如: