第7章数组 前面各章所使用的数据都属于基本数据类型 (整型、实型、字符型),C语言除了提供基 本数据类型外,还提供了构造类型的数据, 们是数组类型、结构体类型、共同体类型等。 构造数据类型是由基本数据类型的数据按照 定的规则组成,所以也称为“导出类型”。 下面简单介绍一下数组概念 1、数组:一组具有相同数据类型的数据的有 序的集合 2、数组元素:数组中的元素。数组中的每 个数组元素具有相同的名称,不同的下标,可 以作为单个变量使用,所以也称为下标变量 在定义一个数组后,在内存中使用一片连续的 空间依次存放数组的各个元素
第7章 数组 • 前面各章所使用的数据都属于基本数据类型 (整型、实型、字符型),C语言除了提供基 本数据类型外,还提供了构造类型的数据,它 们是数组类型、结构体类型、共同体类型等。 构造数据类型是由基本数据类型的数据按照一 定的规则组成,所以也称为“导出类型” 。 • 下面简单介绍一下数组概念: • 1、数组:一组具有相同数据类型的数据的有 序的集合。 • 2、数组元素:数组中的元素。数组中的每一 个数组元素具有相同的名称,不同的下标,可 以作为单个变量使用,所以也称为下标变量。 在定义一个数组后,在内存中使用一片连续的 空间依次存放数组的各个元素
第7章数组 3、数组的下标:是数组元素的位置的一个索 引或指示。 4、数组的维数:数组元素下标的个数。根据 数组的维数可以将数组分为一维、二维、三维 多维数组 7、1一维数组 数组(上面提到):数组是一组有序数据的集 合,数组中每一个元素的类型相同。用数组名 和下标来唯一确定数组中的元素。 维数组中的各个数组元素是排成一行的一组 标变量,用一个统一的数组名来标识,用 个下标来指示其在数组中的位置。下标从0开 始。一维数组通常和一重循环相配合,对数组 元素进行处理
第7章 数组 • 3、数组的下标:是数组元素的位置的一个索 引或指示。 • 4、数组的维数:数组元素下标的个数。根据 数组的维数可以将数组分为一维、二维、三维、 多维数组。 • 7、1 一维数组 • 数组(上面提到):数组是一组有序数据的集 合,数组中每一个元素的类型相同。用数组名 和下标来唯一确定数组中的元素。 • 一维数组中的各个数组元素是排成一行的一组 下标变量,用一个统一的数组名来标识,用一 个下标来指示其在数组中的位置。下标从0开 始。一维数组通常和一重循环相配合,对数组 元素进行处理
第7章数组 7、1、1一维数组的定义(先定义后使用) 定义方式: 类型说明符数组名[整型常量表达式 例、inta[10] 定义一个数组,数组名a,有10个元素, 每个元素的类型均为int。 ·这10个元素分别是:a[0]、a[1]、a[2] a[3]、a[4]、、a[8]、a[9]。 注意: (1)C语言中,数组下标从0开始 (2)C语言不允许对数组的大小做动态 定义,如:
第7章 数组 • 7、1、1 一维数组的定义(先定义后使用) • 定义方式: • 类型说明符 数组名[整型常量表达式] • 例、 int a[10] • 定义一个数组,数组名a,有10个元素, 每个元素的类型均为int。 • 这10个元素分别是:a[0]、a[1]、a[2]、 a[3]、a[4]、....、a[8]、a[9]。 • 注意: • (1)C语言中,数组下标从0开始. • (2)C语言不允许对数组的大小做动态 定义,如:
第7章数组 int n: scanf(%d",&n) int an 因为在编译时,C编译器根据已知数组大小分配 内存。 说明: (1)数组名:按标识符规则。本例就是数组 名。 (2)整型常量表达式:表示数组元素个数(数 组的长度)。可以是整型常量或符号常量,不 允许用变量 ·整型常量表达式在说明数组元素个数的同时也 确定了数组元素下标的范围,下标从0开始~整 型常量表达式-1(注意不是1~整型常量表达
第7章 数组 • int n; • scanf("%d",&n); • int a[n]; • 因为在编译时,C编译器根据已知数组大小分配 内存。 • 说明: • (1)数组名:按标识符规则。本例a就是数组 名。 • (2)整型常量表达式:表示数组元素个数(数 组的长度)。可以是整型常量或符号常量,不 允许用变量。 • 整型常量表达式在说明数组元素个数的同时也 确定了数组元素下标的范围,下标从0开始~整 型常量表达式-1(注意不是1~整型常量表达 式)
第7章数组 C语言不检查数组下标越界,但是使用时, 般不能越界使用,否则结果难以预料(覆盖程 序区程序飞出,覆盖数据区数据覆盖破坏, 操作系统被破坏,系统崩溃)。 本例数组元素个数是10个,下标从0-9。 (3)类型说明:指的是数据元素的类型,可 以是基本数据类型,也可以是构造数据类型。 类型说明确定了每个数据占用的内存字节数。 比如整型2字节,实型4字节,双精度8字节, 字符1字节。 本例数组元素是整型,每个元素占2个字节, 因为有10个数组元素,所以占用20字节。 (4)C编译程序为数组分配了一片连续的空间 (5)C语言还规定,数组名是数组的首地址。 即a=&a[0l
第7章 数组 • C语言不检查数组下标越界,但是使用时,一 般不能越界使用,否则结果难以预料(覆盖程 序区-程序飞出,覆盖数据区-数据覆盖破坏, 操作系统被破坏,系统崩溃)。 • 本例数组元素个数是10个,下标从0-9。 • (3)类型说明:指的是数据元素的类型,可 以是基本数据类型,也可以是构造数据类型。 类型说明确定了每个数据占用的内存字节数。 比如整型2字节,实型4字节,双精度8字节, 字符1字节。 • 本例数组元素是整型,每个元素占2个字节, 因为有10个数组元素,所以占用20字节。 • (4)C编译程序为数组分配了一片连续的空间。 • (5)C语言还规定,数组名是数组的首地址。 即a=&a[0]
第7章数组 7、1、2一维数组的初始化 初始化格式: 数据类型数组名[常量表达式]={初值表} ·初始化:在定义时指定初始值,编译器把初值 赋给数组变量。赋值:使用赋值语句,在程序 运行时把值赋给数组变量,如a[0]=2。 1、一般初始化,例 static int a[10]={0,1,2,3,4,5,6,7,8,9} int array[10]={1,2,3,4,5,6,7,8,9,10}; 2、部分元素初始化,其余元素均为零 例、 static int a[10]={0,1,2,3,4; 仅前5个元素赋初值,后5个元素未指顶初值。 3、全部元素均初始化为0,不允许简写。 static int a[10]={0,0,0,0,0,0,0,0,0,0}
第7章 数组 • 7、1、2 一维数组的初始化 • 初始化格式: • 数据类型 数组名[常量表达式]={初值表} • 初始化:在定义时指定初始值,编译器把初值 赋给数组变量。赋值:使用赋值语句,在程序 运行时把值赋给数组变量,如a[0] = 2。 • 1、一般初始化,例、 • static int a[10]= { 0,1,2,3,4,5,6,7,8,9} • int array[10] = {1,2,3,4,5,6,7,8,9,10}; • 2、部分元素初始化,其余元素均为零。 • 例、static int a[10] = {0,1,2,3,4}; • 仅前5个元素赋初值,后5个元素未指顶初值。 • 3、全部元素均初始化为0,不允许简写。 • static int a[10] = {0,0,0,0,0,0,0,0,0,0};
第7章数组 不能简写为: static int a[10]=0*101 注意:当程序不给数组指定初始值时,编译器 作如下处理: ·(1)编译器自动把静态数组的各元素初始化 为0。 (2)编译器不为动态数组自动指定初始值 4、如果全部元素均指定初值,定义中可以省 略元素的个数,例 static int a[5]={1,2,3,4,5}; 可以写为: static int a[]=1, 2, 3, 4, 5 7、1、3数组元素的引用
第7章 数组 • 不能简写为: • static int a[10] = {0*10}; • 注意:当程序不给数组指定初始值时,编译器 作如下处理: • (1)编译器自动把静态数组的各元素初始化 为0。 • (2)编译器不为动态数组自动指定初始值。 • 4、如果全部元素均指定初值,定义中可以省 略元素的个数,例、 • static int a[5] = {1,2,3,4,5}; • 可以写为: • static int a[ ] = {1,2,3,4,5}; • 7、1、3 数组元素的引用
第7章数组 C语言规定,不能引用整个数组,只能逐个引 用元素,元素引用方式: 数组名[下标表达式] 例、a[0]=a[5]+a[7]-a[2*3] “下标表达式”可以是任何非负整型数据,取 值范围是0~(元素个数-1) 别强调:在运行C语言程序过程中,系统并 不自动检验数组元素的下标是否越界。因此在 编写程序时,保证数组下标不越界是十分重要 的 1个数组元素,实质上就是1个变量,它具有和 相同类型单个变量一样的属性,可以对它进行 赋值和参与各种运算。 在C语言中,数组作为1个整体,不能参加数据 运算,只能对单个的元素进行处理
第7章 数组 • C语言规定,不能引用整个数组,只能逐个引 用元素,元素引用方式: • 数组名[下标表达式] • 例、a[0] = a[5] + a[7] - a[2*3] • “下标表达式”可以是任何非负整型数据,取 值范围是0 ~ (元素个数-1)。 • 特别强调:在运行C语言程序过程中,系统并 不自动检验数组元素的下标是否越界。因此在 编写程序时,保证数组下标不越界是十分重要 的。 • 1个数组元素,实质上就是1个变量,它具有和 相同类型单个变量一样的属性,可以对它进行 赋值和参与各种运算。 • 在C语言中,数组作为1个整体,不能参加数据 运算,只能对单个的元素进行处理
第7章数组 [例6.1]使数组元素a[0]~a[9的值为 0~9,然后逆序输出。 main int i, a[10] for(i=0;i=0; i printf( %d alil 运行输出:9876543210
第7章 数组 • [例6.1] 使数组元素a[0]~a[9]的值为 0~9,然后逆序输出。 • main() • { • int i,a[10]; • for (i=0;i=0; i--) • printf("%d ",a[i]); • } • 运行输出:9 8 7 6 5 4 3 2 1 0
第7章数组 7、1、4一维数组的应用 °[例7-3]输入10个数,用“冒泡法”对10个数排序(由小 到大)。 冒泡法的基本思想:通过相邻两个数之间的比较和交换 使排序码(数值)较小的数逐渐从底部移向顶部,排序 码较大的数逐渐从顶部移向底部。就像水底的气泡一样 逐渐向上冒,故而得名 ·“冒泡法”算法:以六个数9、8、5、4、2、0为例。 第1趟比较(下图1)第2趟比较(下图2) 985 8 854-9 8;555 895-420 854209 5!:8:44 420 54290 4:41:8:2 22:2:8 54208 000:0 第1次第2次第3次第4次结果 第1次第2次第3次第4次第5次结果
第7章 数组 • 7、1、4 一维数组的应用 • [例7-3] 输入10个数,用“冒泡法”对10个数排序(由小 到大)。 • 冒泡法的基本思想:通过相邻两个数之间的比较和交换, 使排序码(数值)较小的数逐渐从底部移向顶部,排序 码较大的数逐渐从顶部移向底部。就像水底的气泡一样 逐渐向上冒,故而得名。 • “冒泡法”算法:以六个数9、8、5、4、2、0为例。 • 第1趟比较(下图1) 第2趟比较(下图2)