C语言入门学习数组笔记_第1页
C语言入门学习数组笔记_第2页
C语言入门学习数组笔记_第3页
C语言入门学习数组笔记_第4页
C语言入门学习数组笔记_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数组笔记

在程序设计中,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数

据元素的集合称为数组。在c语言中,数组属于构造数据类型。一个数组可以分解为多个数

组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数

组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。

1.一维数组的定义和引用

1,一维数组的定义方式

在C语言中使用数组必须先进行定义。一维数组的定义方式为:

类型说明符数组名[常量表达式];

其中类型说明符是任一种基本数据类型或构造数据类型。数组名是用户定义的数组标识符。

方括号中的常量表达式表示数据元素的个数,也称为数组的长度。例如:

inta[10];说明整型数组a,有10个元素。

floatb[10],c[20];说明实型数组b,有10个元素,实型数组c,有20个元素。

charch[20];说明字符数组ch有20个元素。

对于数组类型说明应注意以下几点:

1)数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都

是相同的。

2)数组名的书写规则应遵循标识符命名规则。

3)数组名不能与其它变量名相同。例如:

main()

(

inta;floata[10];

)

是错误的。

4)方括号中常量表达式表示数组元素的个数,如a[5]表示数组a有5个元素.但是其下标

从0开始计算。因此5个元素分别为a[0],a[l],a[2],a[3],a[4]o

5)常量表达式中可以包括常量和符号常量,不能用变量来表示元素的个数,也就是说,C语言

不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。

例如:

#defineFD5main()

(

inta[3+2],b[7+FD];

)

是合法的。

但是下述说明方式是错误的。

main()

intn=5;inta[n];

)

6)允许在同一个类型说明中,说明多个数组和多个变量。如:

inta,b,c,d,kl[10],k2[20];

2.一维数组元素的引用

数组元素是组成数组的基本单元。数组元素也是一种变量,其标识方法为数组名后跟一个下

标。下标表示了元素在数组中的顺序号。

数组元素的一般形式为:数组名[下标]

其中下标只能为整型常量或整型表达式。如为小数时,c编译将自动取整。例如:

a[5]

a[i+j]

a[i++]

都是合法的数组元素。

数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量。在C语言中只能逐个

地使用下标变量,而不能一次弓I用整个数组。

例如,输出有10个元素的数组必须使用循环语句逐个瑜出各下标变量:

for(i=0;i<10;ii»)

printf("%d",a[i]);

而不能用一个语句输出整个数组。

下面的写法是错误的:printf("%d",a);

3.一维数组的初始化

给数组赋值的方法除了用赋值语句对数组元素逐个赋值外,还可采用初始化赋值和动态赋

值的方法。

1.数组初始化赋值是指在数组定义时给数组元素赋予初值,用“初始化列表”方法实现数

组的初始化。数组初始化是在编译阶段进行的。

初始化赋值的一般形式为:

类型说明符数组名[常量表达式卜{值,值……值};

其中在{}中的各数据值即为各元素的初值,各值之间用逗号间隔。例如:

inta[10]={0,1,2,3,4,5,6,7,8.9);

相当于a[0]=0;a[l]=l...a[9]=9;

C语言对数组的初始化赋值还有以下几点规定:

1)可以只给部分元素赋初值。

当{}中值的个数少于元素个数时,只给前面部分元素赋值。例如:

inta[10]={0.1,2,3.4};

表示只给a[0]-a[4]5个元素赋值,而后5个元素自动赋0值。

说明:如果在定义数值型数组时,指定了数组的长度并对之初始化,凡未被“初始化列表”

指定初始化的数组元素,系统会自动把它们初始化为0(如果是字符型数组,则初始化为‘\0’,

如果是指针型数组,则初始化为NULL,即空指针)。

2)只能给元素逐个赋值,不能给数组整体赋值。例如给十个元素全部赋0值,只能写为:

inta[10]={0,0,0,0,0,0,0,0,C.0);

或inta[10]={0};〃未赋值的部分元素自动设定为0

而不能写为:

inta[10]=0;

3)如给全部元素赋值,由于数据的个数已经确定,因此可以不指定数组长度。例如:

inta[5]={l,2,3,415);

可以写成

inta[]={l,2,3,4,5};

如果数组长度与提供初值的个数不相同,则方括号中的数组长度不能省略。

2.对数组作动态赋值,这时可用循环语句配合scant函数逐个对数组元素赋值。

例如:

main()

(

inti,max,a[10];

printf("input10numbers:\n");

for(i=0;i<10;i++)

scanf(',%d",&a[i]);

max=a[0];

for(i=l;i<10;i*i)

if(a[i]>max)max=a[i];

printf("maxmum=%d\n",max);

)

本例程序中第一个for语句逐个输入10个数到数组a中。然后把a[0]送入max中。在

第二个for语句中,从a⑴到a[9]逐个与max中的内容比较,若比max的值大,见把该

下标变量送入max中,因此max总是在已比较过的下标变量中为最大者。比较结束,输

出max的值。

4.一维数组程序举例

2.二维数组的定义和引用

1.二维数组的定义

C语言允许构造多维数组,多维数组元素有多个下标,以标识它在数组中的位置,所以也称

为多下标变量。本小节只介绍二维数组,多维数组可由二维数组类推而得到。二维数组常称

为矩阵把二维数组写成行和列的排列形式

二维数组定义的一般形式是:

类型说明符数组名[常量表达式][常量表达式]

其中常量表达式1表示第一维下标的长度,常量表达式2表示第二维下标的长度。

例如:inta[3][4];

说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共

有3x4个,即:

a[0][0],a[0][l],a[0][2],a[0][3]

a[l][0],a[l][l],a[l][2],a[l][3]

a[2][0],a[2][l],a[2][2],a[2][3]

二维数组在概念上是二维的,即是说其下标在两个方向上变化。但是,实际的硬件存储器却

是连续编址的,也就是说存储器单元是按一维线性排列的。在C语言中,二维数组是按行排

列的。即放完一行之后顺次放入第二行。

先存放a[0]行,再存放a[l]行,最后存放a[2]行。每行中有四个元素也是依次存放。

多维数组元素在内存中的排列顺序为:第1维的下标变化最慢,最右边的下标变化最快

2,二维数组元素的引用

二维数组的元素也称为双下标变量,其表示的形式为:数组名[下标][下标]

其中下标应为整型常量或整型表达式。例如:

a[3][4]

表示a数组三行四列的元素。

注意:在引用数组元素时,下标值应在已定义的数组大小的范围内。行序号和列序号均从0

起算,

3.二维数组的初始化

二维数组初始化也是在类型说明时给各下标变量赋以初值,用“初始化列表”对二维数组初

始化。二维数组可按行分段赋值,也可按行连续赋值。

例如对数组a[5][3]:

1)按行分段赋值可写为:

inta[5][3]={{80,75.92},{61,65.71},{59,63.70),{85,87.90},{76,77.85));

2)按行连续赋值可写为

inta[5][3]={80,75,92,61,65,71,59,63,70,85,87,90,76,77,85(;

这两种赋初值的结果是完全相同的。

对于二维数组初始化赋值还有以下说明.

1)可以只对部分元素赋初值,未赋初值的元素自动取0值。例如:

inta[3][3]={{l},{2},{3});

是对每一行的第一列元素赋值,未赋值的元素取0值。

赋值后各元素的值为:

100

200

300

inta[3][3]={{0,1},{0,0,2},{3»;

赋值后的元素值为:

010

002

300

2)如对全部元素赋初值,则第一维的长度可以不给出。例如:

inta[3][3]={l,2,3,4,5,6,7,8,9);

可以写为:

inta[][3]={12345,67&g};

3)数组是一种构造类型的数据。二维数组可以看作是曰一维数组的嵌套而构成的。设一维

数组的每个元素都又是一个数组,就组成了二维数组。当然,前提是各元素类型必须相同。

根据这样的分析,一个二维数组也可以分解为多个一维数组。c语言允许这种分解。

如二维数组a[3][4],可分解为三个一维数组,其数组名分别为:

a[0]

a[l]

a[2]

对这三个一维数组不需另作说明即可使用。这三个一维数组都有4个元素,例如:一维数

组a⑼的元素为a[0][0],a[0][l],a[0][2],a[0][3]o

必须强调的是,不能当作下标变量使用,它们是数组名,不是一个单纯的下标变

量。

4)在定义时也可以只对部分元素赋初值而省略第1维的长度,但应分行赋初值。例如:

inta[][4j={{0.0.3},{

这样的写法,能通知编译系统;数组共有3行。数组各元素为

0030,

0000

01000

4.二维数组程序举例

3.字符数组

用来存放字符量的数组称为字符数组,在字符数组中的一个元素内存放一个字符。

1.字符数组的定义

形式与前面介绍的数值数组相同。例如:

charc[10];

字符数组也可以是二维或多维数组。例如.

charc[5][10];即为二维字符数组。

2.字符数组的初始化

对字符数组初始化.最容易理解的方式是用“初始化列表",把各个字符依次赋给数组中各

元素。还有用字符串的方式对数组作初始化赋值。

例如:

charc[10]={'c',,'p‘,7't'o','g't'/,'a'm'};

赋值后各元素的值为:数组c

c[0]的值为七’

c[l]的值为**

c[2]的值为p

c[3]的值为T

c[4]的值为O

c[5]的值为g

c[6]的值为T

c[7]的值为目

c[8]的值为4m,

其中c⑼未赋值,由的值为'P'系统自动赋予0值。

把10个字符依次赋给c[0]~c⑼这10个元素。

1.如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。

2.如果花括号中提供的初值个数(即字符个数)大于数组长度,则出现语法错误。

3.如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动

定为空字符(即

4.如果提供的初值个数与预定的数组长度相同或对全体元素赋初值时也可以省去长度说明,

在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。

例如:

charc口二{'c','';p','rTo','gVr';a';m');

3.字符数组的引用

可以引用字符数组中的一个元素,得到一个字符。

4.字符串和字符串结束标志

在c语言中,是将字符串作为字符数组来处理的,字符串中的字符是逐个存放到数组元素

中的。

为了测定字符串的实际长度,C语言规定了一个"字符串结束标志",以字符'\0’作为结束

标志。如果字符数组中存有10个字符,前面9个字符都不是空字符(1\0'),而第10个字符

是'\0’,则认为数组中有一个字符串,其有效字符为9个。也就是说,在遇到字符'\0’时,表示

字符串结束把它前面的字符组成一个字符串。有了'\0'标志后,就不必再用字符数组的长度

来判断字符串的长度了。

C语言允许用字符串的方式对数组作初始化赋值。例如:

charc[]={'c',",'pVrVoVg';r';a';m');

可写为:

charc[]={"Cprogram"};

或去掉{}写为:

charc[]="Cprogram";

用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志上面

的数组c在内存中的实际存放情况为:

Cprogram\0

’\0’是由C编译系统自动加上的。由于采用了‘'0'标志,所以在用字符串赋初值时一般无

须指定数组的长度,而由系统自行处理。若想用一个新的字符串代替原有的字符串,应在

新的字符串末尾加‘\0,

注意:在定义字符数组时应估计实际字符串长度.保证数组长度始终大于字符串实际长度。

如果在一个字符数组中先后存放多个不同长度的字符串,则应使数组长度大于最长的字符串

的长度。

说明:‘\0'代表ASCII码为0的字符,从ASCII码表中可以查到,ASCII码为0的字符不是

一个可以显示的字符,而是一个“空操作符”,即它什么也不做。用它来作为字符串结束标

志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。

5.字符数组的输入输出

字符数组的输入输出可以有两种方法。

⑴逐个字符输入输出。用格式符“虹”输入或输出一个字符。

⑵将整个字符串一次输入或输出。用“胞”格式符,意思是对字符串(string)的输入输出。

说明:

⑴输出的字符中不包括结束符'\0'o

⑵用"%s1'格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。

⑶如果数组长度大于字符串的实际长度,也只输出到遇'0'结束。

⑷如果一个字符数组中包含一个以上‘\04,则遇第一个‘'0'时输出就结束。

⑸可以用scanf函数输入一个字符串。例如:

scanf("驰s",c);

scanf函数中的输入项c是已定义的字符数组名,输入的字符串应短于已定义的字符数组的

长度。

⑹如果利用一个scant函数输入多个字符串,则应在输入时以空格分隔。

注意:scanf函数中的输入项如果是字符数组名,不要再加地址符&,因为在C语言中数组名

代表该数组第一个元素的地址(或者说数组的起始地址)。

输出实际上是这样执行的:按字符数组名找到其数组第一个元素的地址,然后逐个输出其中

的字符,直到遇'\0,为止。

4.字符串处理函数

c语言提供了丰富的字符串处理函数,大致可分为字符串的输入、输出、合并、修改、比

较、转换、复制、搜索几类。使用这些函数可大大减轻编程的负担。用于输入输出的字符

串函数,在使用前应包含头文件“stdio.h”,使用其它字符串函数则应包含头文件”string.h”。

下面介绍几个最常用的字符串函数。

1.字符串输出函数puts

格式.puts(字符数组名)

功能:其作用是将一个字符串(以'\0'结束的字符序列)输出到终端。

#include"stdio.h"

main()

{

charc[]="BASIC\ndBASE";

puts(c);

说明:1.用puts函数输出的字符串中可以包含转义字符

2.在用puts输出时将字符串结束标志,\0'转换成'\尸,即输出完字符串后换行

3.puts函数完全可以由printf函数取代。当需要按一定格式输出时,通常使用printf函数。

2,字符串输入函数gets

格式:gets(字符数组名)

功能:其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符

数组的起始地址。

#include"stdio.h"

main()

(

charst[15];

printff'inputstring:\n");

gets(st);

puts(st);

}

可以看出当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格

作为字符串输入结束的标志,而只以回车作为输入结束。这是与scant函数不同的。

3.字符串连接函数strcat

格式:strcat(字符数组名1,字符数组名2)

功能:把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符串1后

的串标志"\0"o本函数返回值是字符数组1的首地址。

【例7.14]#include"string.h"

main()

(

staticcharstl[30]="Mynameis

intst2[10];

printf("inputyourname:\n");

gets(st2);

strcat(stl,st2);

puts(stl);

)

本程序把初始化赋值的字符数组与动态赋值的字符串连接起来。要注意的是,字符数组1应

定义足够的长度,否则不能全部装入被连接的字符串。

4.字符串复制函数strcpy和strncpy

其一般形式为

strcpy(字符数组L字符串2)

作用是将字符串2复制到字符数组1中去。

说明

⑴字符数组1必须定义得足够大,以便容纳被复制的字符串2O字符数组1的长度不应小于

字符串2的长度.

(2)“字符数组1”必须写成数组名形式(如strl),“字符串2”可以是字符数组名,也可以是

一个字符串常量。例如:strcpy(strl,"China");作用与前面相同。

⑶如果在复制前未对strl数组初始化或赋值,则strl各字节中的内容是无法预知的。

⑷不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。

字符数组名是一个地址常量,它不能改变值,正如数值型数组名不能被赋值一样。

如下面两行都是不合法的:

strl="China”;〃企图用赋值语句将一个字符串常量直接赋给一个字符数组

strl=str2;〃企图用赋值语句将一个字符数组直接赋给另一个字符数组

只能用strcpy函数将一个字符串复制到另一个字符数组中去。用赋值语句只能将一个字符

赋给一个字符型变量或字符数组元素。

(5)可以用strncpy函数将字符串2中前面n个字符复制到字符数组1中去。例如:

strncpy(strl,str2,2);

作用是将str2中最前面2个字符复制到strl中,取代strl中原有的最前面2个字符。但复制

的字符个数n不应多于stl中原有的字符(不包括o

4.字符串比较函数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论