C语言学习----07 数组

       在实际问题中,常常需要对相同类型的一批数据进行处理,例如输出表格、数据排序、矩阵运算等。对于这类问题,如果采用简单变量来设计程序,那么对每个数据项都要设置相应的变量名,并且变量名不能相同,但整个程序将因此变得冗长烦琐。如果数据量很大,采用这种方式几乎无法解决问题。在这种情况下,可采用数组来存储和处理数据。                                                                   在程序设计中,为了处理方便,把具有相同类型的若干变量按一定的顺序组织起来,这些有序排列的同类型数据元素的集合称为数组。数组属于构造数据类型。一个数组可以分解为多个数组元素,用一个统一的数组名和下标来唯一地确定数组中的元素。数组元素可以是基本数据类型或构造类型。因此按数组元素的类型不同,数组可以分为数值数组、字符数组、指针数组、结构体数组等各种类型的数组。数组一般与循环语句结合起来使用,这样可以有效地处理大批量的数据,大大提高了工作效率,十分方便。

  一堆数组

       在C语言中,使用数组前必须先对行数组进行定义。数组要占用内存空间,定义时需要指定数组有多少个元素以及数组类型,以便分配相应的内存空间。一堆数组的定义格式如下:                          数据类型   数组名[常量表达式];                                                                                                    例如:“int a[5];”表示数组名为a,此数组有5个元素。

    说明:                                                                                                                                                    (1)“数据类型”定义数组中各个数组元素的类型。在任何一个数组中,数组元素的数据类型都是一致的。                                                                                                                                              (2)“数组名”定义数组的名称。数组名的命名规则与变量名的命名规则相同。                                (3)“常量表达式” 放在一对方括号([ ])中。注意,必须是方括号,而不能是花括号或圆括号。常量表达式用于表示数组中拥有的元素个数。                                                                                    (4)“常量表达式”必须是由常量或符号常量组成的表达式,而不能是由变量组成的。因为在C语言中,所有的变量都必须先定义,后使用。定义了一个变量之后,允许对这个变量进行修改。所以在定义数组时,一旦数组中元素的个数确定,就绝对不允许改变。                                                    (5) 数组中各元素是按照下标规定的顺序存放在内存中的。比如前文所述,内存是以字节为单位来表示存储空间的,并且在内存中只按照顺序的方式存放数据。、

一堆数组的初始化       

       程序每次运行时,若数组元素的初始值是固定不变的,则可在数组定义的同时,给出数组元素的初值。这种表示形式称为数组的初始化。                                                                                             对一堆数组的初始化有以下几种方法。                                                                                              (1)顺序列出数组全部元素的初值。当数组初始化时,将数组元素的初值依次写在一对花括号内。例如:                                                                                                                                                  int  m[10]={1,2,3,4,5,6,7,8,9,10};                                                                                                     经过上面的定义和初始化之后,m[0]、m[1]、…、m[9]的初值分别为1、2、…、10。                 (2)可以只为部分元素赋值。例如:                                                                                                       int a[10]={0,1,2,3,4};                                                                                                                         这表示只对前五个元素赋值,后5个元素的值全部为0。C语言系统规定,当一个数组的部分元素被初始化时,对于数值型数组,其余各元素的初值自动被设置为0。但是,当定义数组时未对他指定初值,则内部的数组元素的值是不确定的。如果一个数组中全部元素值都为0,则可以写成   int a[10]={0,0,0,0,0,0,0,0,0,0};       或     int a[10]={0};                                                                        (3)在对所有数组元素赋值时,可以不指定数组长度。例如:                                                                 int a[5]={1,2,3,4,5};        也可以写成    int  a[  ]={1,2,3,4,5};                                                             在第二种写法中,花括号中有5个数,系统会据此自动确定a数组的长度为5。但如被定义的数组长度与提供初值的个数不相同,则数组长度不能省略。                                                                 (4)当数组指定的元素少于初值的个数时,按语法错误处理。例如:                                                     int  a[3]={1,2,3,4,5};                                                                                                                      这是不合法的,因为a数组只有3个元素却有5个初值。

一堆数组的引用 

        数组元素是组成数组的基本单元。对数组的引用最终都是通过对其元素的引用来实现的。C语言规定,只能逐个引用数组中的元素,而不能直接引用整个数组。数组元素可以通过数组名加上方括号()括起来的下标表达式来引用。                                                                                                         一维数组的引用格式如下:      数组名 [下标]                                                                                     引用时应该注意如下问题:                                                                                                                (1)数组名表示要引用哪一个数组中的元素,这个数组必须已定义。                                                  (2)下标用方括号( [ ])括起来,表示要引用数组中的第几个元素,可以是变量表达式也可以是常量表达式。例如:x[3]=b1[10-i]+b1[0];                                                                                                     (3)在C语言中,下标的取值范围是0~(N-1)(假定数组中有N个元素)。例如,“int  b[3];”定义了含有3个元素的数组。b[3]是错误的,因为它表示有第4个元素,而这个数组中只有3个元素。                      C语言中只能逐个引用数组元素,而不能一次引用整个数组。程序设计时,量控制数组元素的下标,来实现数组元素的引用。

二堆数组 

   二堆数组的定义 

      二堆数组定义的一般格式如下:                                                                                                                 数据类型    数组名[常量表达式][常量表达式];                                                                          二堆数组定义的格式和一堆数组相同,只是多了一对方括号([ ])及其常量表达式。其中,第一个常量表达式表示第一维(行)的长度,第二个常量表达式表示第二维(列)的长度。例如:                           int a[4] [5];       (定义一个4行5列的整型数组a),可以将数组a看作是由4个一维数组组成,每个一维数组中又包含5个元素。这4个一维数组的名称是a[0]、a[1]、a[2]、a[3],第一个数组a[0]的各元素为a[0][0]、a[0][1]、a[0][2]、a[0][3]、a[0][4]。数组a的各成员如下:                                                  a[0][0]、a[0][1]、a[0][2]、a[0][3]、a[0][4]                                                                                          a[1][0]、a[1][1]、a[1][2]、a[1][3]、a[1][4]                                                                                          a[2][0]、a[2][1]、a[2][2]、a[2][2]、a[2][4]                                                                                          a[3][0]、a[3][1]、a[3][2]、a[3][3]、a[3][4]                                                                            C语言规定,二维数组中各元素在存储是只能线性存放:先存放第一行的数据,再存放第二行的数据,即按行存放,每行数据按下标规定的顺序由小到大存放。

二维数组的初始化       

  二维数组的初始化有如下3种方式。                                                                                                        (1)按行分组赋值。例如:                                                                                                                        int   a[3][4]={ {1,2,3,4},{4,3,2,1},{1,2,3,4} };                                                                                  这是最清楚的对二维数组的初始化。二维数组有几行,就有几个逗号分隔的花括号;有几列,每个花括号中就有几个用逗号分隔的数值;最后将所有的初始化内容再用花括号括起来。              (2)按行连续赋值。例如:                                                                                                                        int  a[3][4]={1,2,3,4,4,3,2,1,1,2,3,4};                                                                                              这种初始化就是将所有的数值都写在一对花括号中,系统按照规定的行列值对数组元素赋值,与前面讲述的方法赋值结果完全相同,但这种方法不够直观。                                                        (3)只对部分元素赋值。例如:                                                                                                               int  a[3][4]={ {1},{4,3},{1,2} };                                                                                                              这种赋值方法相当于     int   [3][4]={ {1,0,0,0},{4,3,0,0},{1,2,0,0} };                                               系统自动将没有赋值的元素赋值为0。又如:                                                                                            int  a[3][4]={ {1},{4} };   相当于   int  a[3][4]={ {1,0,0,0},{4,0,0,0},{0,0,0,0} };                                  对于没有对应花括号的,系统自动将此行元素赋值为0。

    注      如果将数组的所有元素全部赋值,则可以省略第一维的长度,但列数在任何情况下都不能省略。例如:    int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};           系统在这种情况下会以4个数据为单位计数,第一维的长度由“4个数据”的数目决定。还可以采用下面的方式指出要定义的二维数组的第一维的长度。    int  a[ ][4]={ {1},{ },{1} };     有两个逗号分隔的3个花括号,第一维的长度就为3。     

二维数组的引用   

    二维数组的元素的引用格式如下:                                                                                                              数组名[行下标][列下标];                                                                                                             例如,a[3][4],这里的下标用来标识数组元素中的位置。下标可以是整型的常量、变量或表达式,如a[2][2+3]、a[2][n+1]、a[i][j]等,但不能写成 a[2,2+3]、a[2,n+1]、a[i,j]的形式。                        说明:   二维数组的引用与一维数组的引用基本一致,只是二维数组的引用要使用两个下标。需要注意int a[4][5]和a[4][5]的区别,前者定义了一个数组有4行5列,对这个数组的引用最多用到    a[3][4]( 因为下标从0开始);而后者表示对元素的引用,能包含后者的最小数组定义为 int a[5][6]。

矩阵的术语与二维数组下标的对应关系
术语含义下标规律
主对角线从矩阵的左上角至右下角的连线i==j
上三角主对角线以上的部分i<=j
下三角主对角线以下的部分i>=j
副对角线从矩阵的右上角至左下角的连线i+j==N-1

  多维数组 

       多维数组定义的一般格式如下:        数据类型 [长度1] [长度2]...[长度n];                                            三维以上的数组很少用,因为这些数组要占用大量的存储空间。程序一开始运行,就要为所有数组元素分配固定的存储空间。例如,长度为10、6、9、4的四维字符数组,要求有10*6*9*4即2160个字节的存储空间;如果该数组是4个字节的整型数组,则需要8640个字节的存储空间。随着数组的维数增加,对存储空间的需要是成指数增加的。                                                                           计算机计算每个下标是需要时间的。这就意味着,访问多维数组中的某个元素要比访问一维数组的元素慢。

  字符数组

      日常生活中的信息都是通过文字来描述的,例如,发送电子邮件、在论坛上发表文章、记录学生信息等都需要用到文本。程序中也同样会用到文本,C语言中文本信息都是通过字符串实现的,但是C语言中没有提供“字符串”这个特定类型,通常用字符数组的形式来存储和处理字符串。存储字符数据的数组称为字符数组,每个数组元素中存放一个字符。下面详细介绍字符数组和字符串的相关知识。

  字符串与字符数组

     字符串可用字符数组来表示。当把字符串存储到内存中时,除了要将其中的每个字符在入内存外,还要在最后加一个'\0'字符存入内存。这个'\0'字符就是字符串的结束标志,它的ASCI值为0。系统在对一个字符串进行操作时,通常需要知道它的长度,可以根据字符串结束标志来判断其是否结束。首先系统要找到字符串的第一个字符,然后依次向后,在遇到'\0'时认为该字符串结束。有了这个概念后,任意一个字符串都可以看作是由若干字符和一个字符串结束标志组成的。例如"China"包括'C'、'h'、'i'、'n'、a和'\0'6个字符。                                                                                     字符数组“char a[4]={'B','O','Y','\0'};”中存放的字符串为"BOY"。如果执行语句“a[1]='\0';”a数组的内容则变为'B'、'\0'、'Y'和'\0',此时系统认为a数组中存放了一个字符串"B",这是因为字符串以'\0'为结束标志。但不要认为现在数组中的内容只有'B'和'\0',实际上,可以通过下标来引用数组a中的所有元素,如a[2]中的内容依然是'Y'。                                                                    一个字符串可以用一个一维字符数组来存放。若干个字符串可以用二维字符数组来存放,即每行存放一个字符串。例如:char  s[3][4]={"123","ab","A"};该语句表示,s[0][0]的值为'1',s[0][1]的值为'2',s[0][2]的值为'3',s[0][3]的值为'0';s[1][0]的值为'a',s[1][1]的值为'b',s[1][2]的值为'0';s[2][0]的值为'A',s[2][1]的值为'\0'。

  字符数组的定义、初始化及引用                 

    字符数组中每个元素存放的值都是单个字符。在C语言中,规定了用ASCI码值为0的字符作为结束符。ASCI码值为0的字符称为NULL,不可见,是字符串结束标记。                                                 

1.字符数组的定义                                                                                                                                   字符数组的定义格式如下:char   数组名[常量表达式] [..…];字符数组的定义形式与前面介绍的数值数组的定义形式相同,例如:char c1[80]; 这样定义了一个名为c1的字符数组,它包含80个元素。由于字符型与整型通用,因此也可以定义为shortc1[80],但这时每个元素占两个字节的内存单元,可以定义为short  c1[80]; 但这时每个元素占两个字节的内存单元,而不是一个字节。和数值一样,字符数组也可以是二维或多维数组,例如:char c2[8][80];                                                     

2.字符数组的初始化                                                                                                                                  对字符数组进行初始化,即在定义一个字符数组时为它指定初值。字符数组初始化有以下两种方式。                                                                                                                                                   (1)用字符常量初始化。可以通过将字符逐个赋值给数组中的每个元素的方式进行初始化,例如:char c3[10]=('C','H','I','N','A'};   在这个语句中,将每个字符常量(对应的ASCII码)依次存入到对应的数组元素中,如果没有足够的初值,则未赋初值的元素自动赋空字符'\0',其ASCII码值为0。            对所有元素赋初值时可以省略数组长度。例如:char c4[  ]={'1','2','3'};这时c4数组长度自动为3。由于没有标记字符串结束的空字符'\0',因此,这里c4只是一个字符数组而不是一个字符串。char c5[ ]={'1','2','3','\0'};这时c5数组长度自动为4。由于添加了标记字符串结束的空字符'\0',这里c5既是字符数组,又是字符串。下面是对二维字符数组进行初始化的语句。char c6[ ][4]={{'M'},{'a'},{'c'},{'a'},{'o'};                                                                                                                              (2)用字符串常量初始化。字符数组还允许用字符串常量直接进行初始化。在指定数组大小时,一定要确保数组元素个数比字符串长度至少多1个(多出来的1个元素用于存放空字符\0')。一种办法是指定一个足够大的数组来存放字符串,例如:char c7[80]="Stay strong China!";或char c7[80]={"Stay strong China!"}; 当然,进行初始化时也可以省略数组大小,由编译器决定数组的大小,例如:char c8[ ]="stay strong China!";在上面的初始化语句中,虽然字符串常量中只出现了18个字符,但初始化后字符数组c8的长度自动指定为19。这是因为字符串常量总是以空字符'\0'作为结束符。因此当把一个字符串常量存入一个数组时,也要把空字符'\0'存入数组,并以此作为该字符串结束的标志。所以用字符串方式初始化比用字符逐个初始化要多占一个字节。 

3.  字符数组的引用                                                                                                                                     字符数组的引用与其他类型数组一样,通过数组名和用方括号([ ])括起来的下标表达式来引用数组中的各个元素,得到一个字符。

  字符串的输入与输出 

1.用scanf 函数和printf 函数实现字符数组的输入和输出                                                                           (1)按%c的格式,使用scanf函数和printf函数逐个输入和输出字符数组中的各个字符。                 (2)按%s的格式,使用scanf函数和printf函数按字符串的方式输入和输出。                                注:        由于数组名代表数组起始地址,因此在scanf函数中只需写数组名即可,不需要“&”。

2. 字符串输入函数gets和字符串输出函数puts                                                                                         用gets函数可以直接输入字符串,其一般格式如下:   gets(字符数组)                                           功能:从标准输入设备键盘读取一个字符串,存入指定的字符数组。gets函数和使用%s格式的scanf函数都可以接受字符串,但在输入时有区别:scanf函数将回车和空格都看作字符串结束的标志;而gets函数只将回车看作字符串结束的标志,将空格看作字符串的一部分。                                   用puts函数可以输出字符串,其一般格式如下:       puts(字符数组)                                             功能:把字符数组中的字符串输出到显示器。其中,字符串的结束标志将转换成回车换行符。用于输入\输出的字符串函数,在使用前应包含头文件“stdio.h”。

 字符串处理函数 

       为了简化程序设计,C语言提供了字符串处理函数,程序员需要时可以直接调用这些函数。需要指出的是,在使用这些函数之前,应包含头文件“string.h”。                                                                  1.字符串长度函数                                                                                                                                        字符串长度函数的格式如下:  strlen(字符数组)                                                                                功能:测试指定字符串的实际长度(不含字符串结束标志),并返回字符串的长度,其中的参数可以是字符数组名或字符串常量。例如,调用 stren("abcd\0ef\0g")的返回值是4。                    注意: '\0'在C语言的字符串中具有特殊的意义,标志字符串的结束。计算串长时,只计算'\0'之前的字符数据的个数,而不管'\0'之后是什么字符,所以调用后的返回值为4。                             2.字符串连接函数                                                                                                                                        字符串连接函数的格式如下:    strcat(字符数组1,字符数组2)                                                      功能:将存放在字符数组1和字符数组2(也可是字符串常量)的两个字符串连接起来,并存入字符数组1(字符数组1要足够大),同时删除字符串1后的结束标志'\0',组成新的字符串。该函数返回值是字符串1的首地址。                                                                                                           3.字符串比较函数                                                                                                                                      字符串比较函数的格式如下:         strcmp(字符数组1,字符数组2)                                                   功能:对两个字符数组(或字符串)从左到右逐个字符相比较(按字符的ASCII码值的大小),直至出现不同的字符或遇到'\0'为止,并返回比较结果,如下表:        

字符串比较结果及返回值
字符串比较结果返回值
字符串1=字符串20
字符串1>字符串2大于0
字符串1<字符串2小于0

         对字符串不允许执行“==”和“!=”运算,必须用字符串比较函数对字符串进行比较。                     4. 字符串复制函数                                                                                                                                        字符串复制函数的格式如下:   strcpy(字符数组1,字符数组2)                                                          功能:把字符数组(或字符串)2中的字符复制到字符数组(不能是字符串)1中,结束标志也一同复制。字符数组1中原有的信息被覆盖,注意字符数组1必须定义得足够大,以容纳被复制的字符串。                                                                                                                                               注:    不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。例如,设str是字符数组名,则“str="Thank you!";”是非法的,只能使用strcpy函数。                                                       5.小写字母转换为大写字母函数                                                                                                                   小写字母转化为大写字母函数的格式如下:           strupr(字符串)                                                     功能:将指定字符串中所有小写字母均换成大写字母。                                                           6.大写字母转换为小写字母函数                                                                                                                   格式如下:  strlwr(字符串)                                                                                                                 功能:将指定字符串中所有大写字母均换成小写字母。                                                             

  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值