您好,欢迎访问三七文档
第3章数组第3章数组3.1数组的基本概念3.2一维数组3.3多维数组3.4数组作为函数的参数3.5数组与字符串第3章数组3.1数组的基本概念数组是一种构造数据类型,是具有统一名称和相同类型的一组数据元素的集合,它占用连续内存单元进行存储。要引用数组中的特定位置或元素,就要指定数组中的特定位置或元素的位置号(positionnumber)。图3-1显示了整型数组c的数组元素存储分配。这个数组包含7个元素。可以用数组名加上方括号([])中该元素的位置号来引用该元素。数组中的第一个元素称为第0个元素。这样,c数组中的第一个元素为c[0],c数组中的第二个元素为c[1],…,c数组中的第七个元素为c[6]。一般来说,c数组中的第i个元素为c[i-1]。注意:方括号中的位置号通常称为下标(subscript)。下标应为整数或整型表达式。带下标的数组名一般称为下标变量,可用于赋值语句的左边。例如:c[3]=72;第3章数组图3-1整型数组c的数组元素存储分配示意第3章数组3.2一维数组3.2.1一维数组的声明数组在使用前必须先声明。声明一个一维数组的形式如下:类型标识符数组名[数组长度]其中:①数组名必须遵循C++语言对标识符的要求,其命名规则与其它变量名的相同。②数组长度是个常量表达式,它规定了数组的大小,即所声明的数组由多少个数据类型相同的存储空间组成。第3章数组组成数组的对象称为该数组的元素。数组元素可存储的数据类型由声明时指定的C++语言数据类型决定。数组的声明为以后使用数组分配了存储空间,数组中每个元素在内存中是依次排列的。例如,intScore[50];定义了名称为Score的一维数组,该数组有50个元素,是int类型的。在声明数组时,要注意数组的长度只能由常量表达式来决定,不能是变量。即,数组的长度必须是确定的。例如:intnMonth;floatfSales[nMonth*12];是错误的。这个声明在编译时编译器会给出错误信息。第3章数组3.2.2一维数组中的元素访问数组中的每个元素可以当成普通的变量使用。访问一维数组元素的形式如下:数组名[下标]下标就是元素索引值,它代表了要被访问的数组元素在内存中的相对位置。下标值的允许范围从0开始到数组长度-1。下标等于0代表要访问的元素在数组的第1个位置上,下标等于1代表要访问的元素在数组的第2个位置上,依次类推。第3章数组3.2.3一维数组的初始化变量可以在声明时赋初值,数组也可以在声明时给所有或部分数组元素赋初始值。要给一维数组元素赋初始值,有如下两种形式。形式1:类型标识符数组名[数组长度]={第0个元素值,第1个元素值,…,第n-1个元素值}形式2:类型标识符数组名[]={第0个元素值,第1个元素值,…,第n个元素值}第3章数组3.3多维数组3.3.1多维数组的声明声明一个多维数组的形式如下:类型标识符数组名[长度1][长度2]…[长度n]同一维数组相同,多维数组的数组名必须遵循C++语言标识符的命名规则,常量表达式中不能有任何变量出现。为了更直观地介绍多维数组,下面以二维数组为例。声明一个二维数组的形式如下:类型标识符数组名[第1维长度][第2维长度]例如,语句floatfMatrix[3][4]将声明一个数组名为fMatix且第1维长度为3、第2维长度为4的二维数组。在二维数组中,第1维常常称为行,第2维常常称为列。这样,一个二维数组就可同一个二维表格对应起来,如表3-1所示。第3章数组表3-1二维数组与表格列行01230fMatrix[0][0]fMatrix[0][1]fMatrix[0][2]fMatrix[0][3]1fMatrix[1][0]fMatrix[1][1]fMatrix[1][2]fMatrix[1][3]2fMatrix[2][0]fMatrix[2][1]fMatrix[2][2]fMatrix[2][3]第3章数组3.3.2访问多维数组中的元素要访问多维数组中的元素,同样需要指定要访问的元素的下标。多维数组的元素有多个下标,其书写形式如下:数组名[第1维下标][第2维下标]…[第n维下标]下标的值也是从0开始,不能超过该维的长度减1。下标的值可以是任意表达式的值,只要其值在该下标的有效范围内即可。要访问二维数组中的某个元素,必须给出该元素所在的行和列。例如,fMatrix[2][1]代表数组名为fMatrix的二维数组中位于第2(从0开始)行、第1(从0开始)列的元素。同一维数组一样,二维数组的元素也可以当成变量进行赋值或参与各种表达式的计算。第3章数组3.3.3二维数组的初始化同一维数组一样,二维数组也可以在声明时赋初始值,其形式如下。形式1:类型标识符数组名[第1维长度][第2维长度]={第0个第2维数据组},{第1个第2维数据组},…,{第n-1个第2维数据组}}其中,n等于第1维长度。形式2:类型标识符数组名[第1维长度][第2维长度]={第0个元素值,第1个元素值,…,第m个元素值}其中,m小于或等于第1维长度乘以第2维长度。在两种形式中,如果花括号中给出的元素个数少于实际的元素个数,则剩余的元素就不会被赋予初始值;如果花括号中给出的元素个数大于实际的元素个数,则编译器会给出错误信息。第3章数组3.4数组作为函数的参数在C++语言中,将整个数组作为参数传递给函数要涉及到指针的概念。有关内容将在本书的第6章进一步讨论,这里只结合数组参数的传递过程做简单介绍。要将数组作为参数传递给函数,可由不带方括号的数组名进行。例如,如果数组声明如下:intnMatrix[20];则将数组传递给函数,可用下列函数调用语句:myArray(nMatrix,20);要传递数组,大体上有以下两种形式。形式1:类型标识符函数名(类型标识符数组名[],int长度)形式2:类型标识符函数名(类型标识符数组名[长度])第3章数组第一种形式适于处理不同长度的数组,数组的实际长度通过另一个参数传递给函数;而第二种形式只可用于传递长度固定的数组。不管哪一种形式,传递给函数的都不是数组本身,而是保存数组第0个元素的内存单元的地址(即存储数组的起始地址)。通过传递数组的开始地址,被调用函数可得到实际数组的准确存放位置。因此,被调用函数在函数体中修改数组元素时,实际上是修改原内存地址中的数组元素。数组名的值实际上就是保存数组中第1个元素的内存地址的变量,这样的变量称为指针型变量。当进行数组传递时,实际参数将此地址值传递给形式参数,使形式参数同实际参数指向同一内存地址。这样在函数中如果改变数组中某个元素的值,在函数外数组中该元素的值也发生改变。第3章数组尽管函数调用按地址传递整个数组,但各个数组元素和简单变量一样是按值传递。这种简单的单个数据称为下标变量或标量(scalar)。要将数组元素传递给函数,可用数组元素的下标名作为函数调用中的参数。数组元素、数组名与作为函数形式参数的数组名的这种关系可用图3-2来表示。第3章数组3.5数组与字符串3.5.1字符数组字符型数组就是数组元素的类型是字符型的数组,简称为字符数组。例如,charCBuffer[256];、unsignedcharpDBufrer[5][80];都是字符型数组。字符型数组的定义和声明同普通数组没有什么区别,主要的不同之处在于字符数组元素的初始化与使用方法。字符型数组也可以用通常数组初始化的形式对其元素进行初始化,只不过由于字符型数组中的元素是字符类型,一般用字符型常量给字符型数组赋初值,例如:charmyChars[]={'T','h','i','s','','a','','c','o','m','p','u','t','e','r'};第3章数组字符型数组常用两种特殊的初始化方法,形式如下:形式1:char数组名[]=字符串形式2:char数组名[]={字符串}这两种形式产生的效果是相同的,它们会产生一个以字符串常量中的每个字符为数组元素且在末尾加个“\0”的特殊数组。例如:charpMyStrinq[]=Thisisacomputer;执行后,pMyString数组中的元素依次是:'T','h','i','s','','a','','c','o','m','p','u','t','e','r','\0‘它等同于charpMyString[]={‘T’,‘h’,‘i’,‘s’,‘’,‘a’,‘’,‘c’,‘o’,‘m’,‘p’,‘u’,‘t’,‘e’,‘r’,‘\0’};或charpMyStrinq[]={Thisisacomputer};第3章数组说明:①转义字符“\0”表示的是字符串常量中字符串的结束标志,在末尾保存了0的字符型数组,也可以当成字符串来使用。②字符型数组也是数组,只不过赋初值的方法有点特殊,但不能用赋值的方法进行赋初值。例如:charpMyStrinq[20];pMyStrinq[]=“Thisisacomputer”;是错误的。③变量可以重复赋值,即变量表示的值在程序运行的过程中可以通过赋值语句改变,但是字符型数组只能改变其元素的值,不能有“数组名=字符串;”这样的赋值语句出现。④数组的长度在声明时就已经确定(字符串中字符个数+1),在使用的过程中不能更改。第3章数组3.5.2字符串的基本运算C++语言中没有字符串型变量,要实现字符串的运算,例如,连接两个字符串,求字符串长度等,需要另外编写程序对字符型数组进行操作。在C++语言的库函数中提供了各种字符串运算的函数,可以直接调用。1.求字符串的长度C++语言的标准字符串以'\0'结尾,所以求一个字符串的长度,要从字符串的第一个字符算起,直到碰到'\0'为止。假设字符串保存在数组pString中,求字符串长度的程序段如下:charpString[]=字符串;intnSize=0;while(pString[nSize]!='\0')nSize++;执行完毕后,整型变量nSize中保存的值就是字符串pString的长度。第3章数组2.字符串的复制字符串的复制就是将一个字符型数组(源字符串)的内容照原样复制到另一个字符型数组中。方法是:把源字符型数组中的字符依次赋给目的字符型数组,直到碰到'\0'为止。假设源字符串保存在数组pSource中,目的字符型数组为pDestination,则字符串复制的程序段如下:charpSource[]=字符串;charpDestination[]=[N];//N≥源字符串长度+1intnIndex=0;while(pSource[nSize]!='\0'){pDestination[nIdex]=pSource[nIdex];nIndex++;}pDestination[nIdex]='\0';//标识字符串结束最后的while循环语句还可简化写为while(pDestination[nIdex]=pSource[nIndex++]);第3章数组3.字符串的连接字符串的连接就是将一个字符串连接到另一个字符串的末尾。在进行字符串的连接时,先要找到要被连接的字符串的尾部,然后从尾部的位置开始将另一个字符串复制过来。必须注意的是,存储原字符串的数组要有足够的空间来容纳连接进来的另一个字符串,否则在运行时可能产生保护模式错误。假设原字符串保存在字符数组pDest中,要连接进来的字符串存在字符数组pTocat中,则进行字符串连接的程序段如下:第3章数组charpTocat[]=要连接进来的字符串;charpDest[N]=“现字符串”;//N≥现字符串长度+要连接进来的字符串长度+1intnSize=0;intnIndex=0;while(pDest[nSize]!=0)//找到要被连接的字符串的尾部nSize++;do{pDest[nSize++]=pTocat[nIdex];nIdex++;}while(pTocat[nIdex]!='\0');pDest[nSize]='\0';
本文标题:第3章数组.
链接地址:https://www.777doc.com/doc-2155783 .html