第七章 数组

19
第第第 第第 维维维维维维维维维 维维维维维维 维维维维维维维维 维维维维维维维维维

Upload: grady-sexton

Post on 03-Jan-2016

24 views

Category:

Documents


3 download

DESCRIPTION

第七章 数组.  一维和二维数组的定义  数组元素引用  字符数组和字符串  数组应用的基本算法. 7.1.1 一维数组的定义 数组的维数是指表示数组使用的下标个数,如果数组中每个元素只带有一个下标,称这样的数组为一维数组。 定义形式为: 类型说明符 数组名 [ 常量表达式 ] ; 类型说明符指出数组元素的数据类型,数组名是标识符,元素个数使用方括号和常量表达式。 【 讨论 】 C 语言数组大小的规定。 【 讨论 】 如何理解数组名。. 7.1 一维数组. 7.1 一维数组. 7.1.2 一维数组的引用 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第七章  数组

第七章 数组

一维和二维数组的定义 数组元素引用 字符数组和字符串 数组应用的基本算法

Page 2: 第七章  数组

7.1.1 一维数组的定义 数组的维数是指表示数组使用的下标个数,如果数组

中每个元素只带有一个下标,称这样的数组为一维数组。 定义形式为:

类型说明符 数组名 [ 常量表达式 ] ; 类型说明符指出数组元素的数据类型,数组名是标识

符,元素个数使用方括号和常量表达式。 【讨论】 C 语言数组大小的规定。 【讨论】如何理解数组名。

7.1 一维数组

Page 3: 第七章  数组

7.1.2 一维数组的引用 C 语言中,一个数组不能整体应用,数组名是一个地址常量,

不能对其赋值,只能使用数组中的元素。 方法: 数组名 [ 下标 ] 【讨论】 C 语言使用下标的规定。

7.1 一维数组

Page 4: 第七章  数组

7.1.3 一维数组存储 C 系统定义数组时,根据定义语句中的空间需求,分配足

够的的存储空间,数组元素顺序存放在这片存储单元中。下标为 0 的元素排在最前面,每个元素占据的存储空间完全相同。

计算数组的空间开销,应该使用 sizeof 算符,方法有二:

( 1 )存储容量 = 数组元素个数 *sizeof (数组元素类型名)

( 2 )存储容量 = sizeof (数组名)

7.1 一维数组

Page 5: 第七章  数组

7.1.4 一维数组初始化 一维数组定义时可以用花括号对全部或前面一部分

数组元素赋初值,叫初始化。通过初始化也可以定义一维数组。

数组也是变量,在作用域和存在期方面与简单变量的规定相同,全局数组在程序开始执行前建立,在静态存储区存储,定义全局数组时,可以进行初始化,如果没有,系统自动将全局数组的值初始化为 0 。局部数组存储在动态存储区中,建立时如果没有进行初始化,其值是不确定的。

7.1 一维数组

Page 6: 第七章  数组

7.1.4 一维数组初始化 例 : 解释下面数组定义和初始化的意义: int a[6]={1,2,3,4,5,6}; int a[6]={1,2}; int a[3]={1,2,3,4}; int a[]={1,2,3,4,5,6}; 【讨论】例题的结果及原因。

7.1.5 一维数组实例

7.1 一维数组

Page 7: 第七章  数组

7.2.1 二维数组的定义 二维数组:数组中每个元素带有两个下标。 定义形式为: 类型说明符 数组名 [ 常量表达式 1] [ 常量表达式

2] ; 逻辑上,可把二维数组看成是一个矩阵,常量表

达式 1 表示矩阵有几行,常量表达式 2 表示矩阵的列数。 可以把二维数组看作是一种特殊的一维数组,它

的元素又是一维数组。即二维数组是数组的数组。 【讨论】 int a[3][4]; 的矩阵理解和数组之数组理解。 【讨论】多维数组的理解问题。

7.2 二维和多维数组

Page 8: 第七章  数组

7.2.2 二维数组的引用 引用二维数组元素时必须带有两个下标, 形式如下: 数组名 [ 下标 1][ 下标 2]

7.2.3 二维数组存储 二维数组在内存中占据一系列连续的存储单

元,数组元素按行顺序存放,先放行下标是 0 的元素,再放行下标是 1 的元素, ...

数组 int a[3][4] 的存储示意

a[0][0] a[0][1]

a[0][2]

a[0][3]

a[1][0]

a[1][1]

a[1][2]

a[1][3]

a[2][0]

a[2][1]

a[2][2]

a[2][3]

7.2 二维和多维数组

Page 9: 第七章  数组

7.2.4 二维数组初始化 二维数组定义时也可以用花括号对全部或

前面一部分数组元素赋初始化。通过初始化也可以定义二维数组。

例: 解释下面数组定义和初始化的意义: int a[2][3]={1,2,3,4,5,6}; int a[2][3]={1,2}; int a[2][3]={{1,2,3}, {4,5,6} }; int a[3][4]={{1,2}, {3}, {4,5},{6}}; int a[3][4]={{1,2},{3}, }; int a[2][3]={1,2,3,4,5,6,7,8}; int a[][3]={ {1,2,3},{4,5},{6}}; int a[][3]={ 1,2,3,4,5,6,7}; 7.2.5 二维数组实例

7.2 二维和多维数组

Page 10: 第七章  数组

7.3.1 字符数组 字符数组是元素数据类型是字符类型的一维数组。字符数组引用、存储、初始化的方法都与一维数组相同,只是要注意字符数组的元素是字符,有特殊的字面表示格式。

字符数组初始化的方法也和一维数组相同。 例: char s[5]={‘1’,’2’,’3’,’4’,’

5’}; char s[5]={‘1’,’2’}; char s[]={‘1’,’2’,’3’,’4’,’5’}; 初始化时没有赋值的元素值为空是编码为 0

的字符,叫空字符,用’ \0’ 表示。它即不是空格字符( 32 ),也不是 0 字符( 48 )。

7.3 字符数组和字符串

Page 11: 第七章  数组

7.3.2 字符串 C 语言中用双引号”括起来的任意字符序列,就是字符串。 C 语言中,顺序书写的两个字符串中间仅由空格、换行符

或制表符分隔,编译时,自动将这些字符串连接成一个长的字符串。

字符串里不能直接出现双引号”(被认为是结束符),需用换意序列“ \”” 表示双引号字符”

对程序中的字符串字面量,系统用字符数组方式保存,连续、顺序存放每一个字符,最后加一个空字符“ \0” 做结束标志。

结束标志“ \0” 是字符数组与字符串的区别。 【讨论】程序中为什么需要字符串的结束标志? 【讨论】 C 语言表示字符串长度的方法

7.3 字符数组和字符串

Page 12: 第七章  数组

7.3.2 字符串 C 语言中没有字符串变量,通过字符数组可以实现相关

的功能,字符串是字符数组最普通的具体应用。 当要用字符数组存储(可能变化的)字符串时,应考虑: ( 1 )定义变量时,考虑可能存储的最长字符串的长度。 ( 2 )在字符数组中顺序存放字符串的每一个字符,最后

加上“ \0” 。 ( 3 )对字符数组初值赋值方法的扩充,例: char str[]= “China”; char str[]={“China”}; char str[10]={“China”}; char str[5]=“morning!”; 字符串操作中,要注意控制不要超出字符数组的空间限制。

7.3 字符数组和字符串

Page 13: 第七章  数组

7.3.3 字符串数组 字符串数组就是数组中的每一个元素又都是存放字

符串的数组。 可以将一个二维字符数组看作一个字符串数组。 例: char line[10][80]; 数组 line 共有 10 个元素,

每个元素可以存放 80 个字符( 79 个普通字符,一个结束字符),第一个下标决定字符串个数,第二个下标决定字符串的最大长度。 line 是有 10 个字符串的数组,这些字符串的最大长度为 79 。

7.3 字符数组和字符串

Page 14: 第七章  数组

7.3.3 字符串数组 字符串数组的初始化方法: 例: char str[3][5]={“a”, “ ab”, “abc”}; /* 根据定义的大小初始化 */ char str[][5]={“a”, “ab”, “abc”}; /* 根据右边字符串的个数,定义数组大小 */ 本数组的存储示意如下:

7.3 字符数组和字符串

Page 15: 第七章  数组

7.3.4 字符串函数 C 标准函数库中提供了许多相关的函数,它们的原型说明在两个头文件中, ctype.h 说明了一组字符类型判断函数, string.h 说明了许多字符串处理函数。另外标准输入输出函数库中还有用于字符串输入和输出的函数。7.3.4.1 字符串输入输出

1. scanf 的 s 格式串可以实现字符串的整体输入。例: char str[20]; scanf(“%s”,str); /*str 是地址 */ 2. printf 的 s 格式串可以实现字符串的输出,例: printf(“%s”,str); /*str 是地址 */ 3. gets从终端输入字符串行 形式: gets(str); str 是存放字符串的起始地址。可以是字符数组名、字符数组元素地

址或下一章将要介绍的字符指针。

7.3 字符数组和字符串

Page 16: 第七章  数组

7.3.4.1 字符串输入输出 -- 包含头文件 stdio.h 4.puts向终端输出字符串 形式: puts(str); str 是输出字符串的起始地址,从这一地址开始,依次输出存储单元

中的字符,直到遇到第一个‘ \0’ 为止。并自动输出一个换行符。 str 是存放字符串的起始地址。可以是字符数组名、字符数组元素地

址或下一章将要介绍的字符指针。 7.3.4.2 字符串处理函数 -- 包含头文件 string.h 1. 字符串复制函数 strcpy 。调用形式如下: strcpy(s1,s2) 2. 字符串连接函数 strcat 。调用形式如下: strcat(s1,s2)

7.3 字符数组和字符串

Page 17: 第七章  数组

7.3.4.2 字符串处理函数 3. 求字符串长度函数 strlen 。调用形式如下: strlen(s) 4. 字符串比较函数 strcmp 。调用形式如下: strcmp(s1,s2) 【讨论】 C 语言字符串相等的概念和字符比较规则 7.3.4.3 字符判断函数 --- 包含头文件 ctype.h 。 字符判断函数大部分是用宏实现的。返回值都是真和假值,

即非 0 和 0 。如 isalpha(c) :判断 c 是否为字母; isdigit(c) :判断 c是否为数字; isupper(c ) : 判断 c 是否为大写字母… .. 。

【讨论】使用字符判断函数设计程序的好处 7.3.5 字符数组和字符串实例

7.3 字符数组和字符串

Page 18: 第七章  数组

首先,如果数组元素属于基本类型,这些元素可以作为基本类型使用,当然可以作为函数的实参,送给函数处理,实参形参传递的是数组元素的值,形参操作不影响实参的值,处理的结果以返回值的方式带回,也可以赋给数组元素。这种方式处理数组元素与处理基本类型的变量没有什么区别。

第二,可以利用全局变量,将要处理的数组定义成全局数组,使每一个函数都能操作需要的数组。

用数组作函数的参数,这样可以在函数里处理整个数组的数据,也可以通过不同调用完成同一函数对不同数组的同样计算。

数组名作函数参数,实参形参传递的是数组名表示的地址值(依然是值传递)。因此,实参和形参数组操作的是同一片空间。形参数组操作可以改变实参数组元素的值。这是用数组作参数和用简单变量作参数最大的不同。

实参数组和形参数组的类型必须一致,如果需要在函数中知道处理元素的个数,可以另设一个表示元素个数的参数。

7.5 实例

7.4 数组作为函数的参数

Page 19: 第七章  数组

本章小结

本章主要知识点: 数组基本概念。数组定义,数组类型,数组唯数,数组存储,数组

元素和数组下标概念,数组说明,初始化方法,数组元素下标的范围,正确引用数组中的元素,数组元素的输入和输出方法,多唯数组元素的排列方法和初始化等问题。

字符型数组。字符型数组与其他数组的区别,字符串及其特点,字符型数组初始化,使用不同的库函数输入输出字符串,对字符串的简单处理。

数组与函数间的关系。将数组作为参数在函数之间传递,将数组中的元素作为参数在函数之间传递。

常见的使用数组的算法

掌握本章内容的关键是理解数据类型对数据表示和运算的约束。