[工学]第七章 数组

上传人:tia****nde 文档编号:70785291 上传时间:2019-01-18 格式:PPT 页数:45 大小:418.99KB
返回 下载 相关 举报
[工学]第七章 数组_第1页
第1页 / 共45页
[工学]第七章 数组_第2页
第2页 / 共45页
[工学]第七章 数组_第3页
第3页 / 共45页
[工学]第七章 数组_第4页
第4页 / 共45页
[工学]第七章 数组_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《[工学]第七章 数组》由会员分享,可在线阅读,更多相关《[工学]第七章 数组(45页珍藏版)》请在金锄头文库上搜索。

1、1,第七章 数组,C+程序设计教程,2,本章主要内容,数组的概念 数组的定义与引用 数组的存储顺序 数组的初始化 二维数组 数组作为函数参数,3,一. 数组的概念,数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。 数组属于构造类型。,4,数组( Arrays ),具有一个下标的数组称为一维数组 一维数组一般形式为: :说明了数组元素所属的数据类型,可以是整型、浮点型等。 :指明了数组的大小,即数组元素的个数,也称为数组的长度,它必须是一个整型值,并且不可缺省。,5,二. 数组的定义与引用,一维数组的定义 类型说明符 数组名 常量表达式 ; 例如: int a1

2、0; 表示 a 为整型数组,有10个元素:a0.a9,引用 必须先定义,后使用。 只能逐个引用数组元素,而不能一次引用整个数组 例如:a0=a5+a7-a2*3,该常量表达式的值是在编译时确定的 ,分配固定大小的空间 ,像变量定义一样明确。如是变量,只能在运行时确定,6,数组( Arrays ),数组是同类元素的集合,它的元素排列在连续的空间中,按下标来标记 描述数组必须给出元素类型,元素个数 元素个数必须在编程时确定,任何变量都不允许 int aa ; / 表示int a97; int n = 100 ; int an ; / 错: 元素个数必须预知 const int n = 100 ;

3、int an ; / ok int a ; / 错: 无元素个数 int a = 1, 2, 3, 4, 5 ; / ok:通过初始化确定元素个数,7,数组( Arrays ),数组存放形式:在说明一个数组后,系统会在内存中分配一段连续的空间用于存放数组元素。 如说明一个元素个数为10的整型数组a: int a10; 则它在内存中存放的形式如图:,8,数组的存储顺序,数组元素在内存中顺次存放,它们的地址是连续的。 例如:具有10个元素的数组 a,在内存中的存放次序如下:,数组名字是数组首元素的内存地址。 数组名是一个常量,不能被赋值。,9,数组的初始化,数组初始化可选,但须遵循语法无初始化的数

4、组按规定取默认值 int array15 = 1, 2, 3, 4, 5, 6 ; / 错: 初始值个数超元素个数 int array25 = 1, , 2, 3, 4 ; / 错: 不能以逗号方式省略 int array35 = 1, 2, 3, ; / 错: 同上 int array45 = ; / 错: 初始值不能为空 int array55 = 1, 2, 3 ; / ok: 后面元素取0 int array65 = 0 ; / ok: 元素全为0 int array75 ; / ok: 元素值不确定 int a35 = 1, 2, 3, 4, 5 , 2, 3, 4, 5, 6 ,

5、3, 4, 5, 6, 7 ;,10,全局数组和全局静态数组的初始化是在main函数运行之前完成的。 局部数组和局部静态数组的初始化是在其所属函数运行后开始的。,11,例1:,数组的作用域规则和单个变量相同。定义为局部作用域的数组,刚分配完空间时,其内容是不定的。全局作用域数组和静态局部作用域数组初始为全0 int array110; /全局数组 void main() int array210; /局部数组 fun(); void fun() static int array310; /局部静态数组 array30+; coutarray31endl; ,12,数组array1在所有函数外面

6、定义,它是全局的,因此,可以被任何函数访问。这个数组没有初始化,所以数组的每个元素都初始为0。在32位机器上,这个数组中每个元素占4个字节,所以共占40个字节内存空间。 数组array2一个局部数组,定义了在栈中分配的数组,它有10个整型数。由于该数组在栈中,它受到了栈空间大小的限制。如果定义数组的元素很多(如5000),则有可能使程序运行由于不能满足数组分配而突然终止。不能满足内存分配要到程序运行时才知道,因为编译只管语 法检查,而不管运行环境。程序连接时,才确定各内存空间包括栈空间的大小。确定栈空间 大小后,程序运行中遇到大容量数组分配而不能满足之时,才会有所表示。,13,数组array3

7、一个静态局部数组,它有10个整型数,这个数组不在栈中,而是在全局数据区。它没有显式初始化,所以默认初始值为0,与全局数组相同。但在其它函数 中, array3是不可见的。因为是静态的,数组在func()调用之间保持其值。如果在第一次调用func()时改变了array3的值,则第2次调用func()时,func()拥有这些改变了的值。 编程时,如果要定义一个很大的数组,可以通过将其定义为静态或全局来解决,也可以 将其在堆内存中分配(见后面章节)。,14,例2 :,#include void main() int A10,B10; int i; for(i=0;i10;i+) Ai=i*2-1;

8、B10-i-1=Ai; ,for(i=0;i10;i+) cout“A“i “=“Ai; cout“ B“i “=“ Biendl; ,程序运行结果 A0=-1 B0=17 A1=1 B1=15 A2=3 B2=13 A3=5 B3=11 A4=7 B4=9 A5=9 B5=7 A6=11 B6=5 A7=13 B7=3 A8=15 B8=1 A9=17 B9=-1,16,#include int main() int a=1,2,3,4,5; for(int i=0; isizeof(a)/sizeof(a0); +i) std:coutai“ “; std:cout“n“; ,17,字符数

9、组,也称为字符串,实际上是1字节的整数数组。处理字符数组的方法与处理其他数组相同,但若考虑到了字符串末尾的,0,结束符,是很有益的。 初始化字符数组有两种方法, 一种是: char array10=“hello“; 另一种是: char array10=h,e,l,l,0;,字符数组,18,第一种方法用途较广,初始化时,系统自动在数组没有填值的位置用,0补上。另外, 这种方法中的花括号可以省略,即能表示成: char array10=“hello“; 第二种方法一次一个元素地初始化数组,如同初始化整型数组。这种方法通常用于输 入不容易在键盘上生成的那些不可见字符。 例如,下面的代码中初始化值为

10、若干制表符: char chArray5=t,t,t,t,0); 这里不要忘记为最后的,0分配空间。如果要初始化一个字符串“hello“,那为它定义的数组至少有6个数组元素。 例如,下面的代码给数组初始化,但会引起不可预料的错误: char array5=“hello“; 该代码不会引起编译错误,但由于改写了数组空间以外的内存单元,所以是危险的。,19,例如,下面的程序输出一个字符串: #include void main() char chArray30; cin.get(chArray,30); for(int i=0; chArrayi!=0; i+) cout chArrayi; co

11、utendl; get()是输人流的成员函数 ,它的原型为: get(char *target,int count,char delimeter=n); 其中target为存放一系列字符的空间地址,count为限制最长的读取字符个数,delimeter为规定的结束符。遇到此结束符时,尽管还没有到达读取字符最大个数,也还是结束读人过程。 实际上没有必要让i达到30。用户也许不会键入这么多字符。cin.get()在用户输入的最后字符后面加上0。人们对0之后的无定义字符没有兴趣。 可以用“chArrayi;”来代替前面的终止条件,也即for循环可以写成: for(int i=0;chArrayi;i

12、+),20,#include #include void main() char ch=“how are you“; cout “size of array: “ sizeof(ch) endl; cout “size of string: “ strlen(“how are you“) endl; 运行结果为: size of array:12 size of string:ll 例中,数组大小为12,而字符串长度为11。,21,向函数传递数组,无论何时,将数组作为参数传给函数,实际上只是把数组的地址传给函数。物理上,把整个数组放在栈中是不合理的,因为栈大小是一定且有限的。如果把传送给函数的

13、整个数组都放在栈中(内存的大块复制),则很快会把栈空间用光。,22,例如下面的程序调用一个函数求数组元素之和:,#include int sum(int , int); void main() static int ia5=2,3,6,8,10; int sumOfArray; sumOfArray=sum(ia, 5); cout “sum of array: “ sumOfArray endl; int sum(int array, int len) int iSum=0; for(int i=0; ilen; i+) iSum+=arrayi; return iSum; ,23,传递给标

14、准库函数 C+中有一个memset()的函数,它可以一字节一字节地把整个数组设置为一个指定的值。memset()函数在 #include 头文件中声明,它把数组的起始地址作为其第一个参数,第二个参数是设置数组每个字节的值,第三个参数是数组的长度(字节数,不是元素个数)。其函数原型为: void *memset(void*,int,unsigned); 其中void*表示地址,详细介绍见86节。 例如,下面的代码用数组做参数传递给标准函数memset(),以让其将数组设置成全0: #include void main() int ia150; memset(iai,0,50*sizeof(int

15、); /. static int a5; :memset(a,1,2); couta0endl; /结果:257 ,24,数组( Arrays ),数组有诸多缺陷,造成编程艰难和不安全 int a5 = 1,2,3,4,5, c5; int b5 = a; / 错:无法拷贝创建 c = a; / 错:无法整体拷贝和局部拷贝 a8 = 10; / 错:无法动态扩容和随意增减元素 for(int i=0; i=5; +i) / 错:无法防范下标溢出 ai = i+1; if(a=c) a0 = 2; / 错:不可比较 int a5 = 1; / 初始化呆板,无法获得全初值,25,五. 二维数组,定义: float a34; 初始化: int a23 = 1,2,3,4,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号