目录
数组概念:
- 数组就是一组具有相同数据类型的数据的有序集合。
数组特点:
- 数组是一组有序数据的集合。
- 数组中的每一个元素都属于同一个数据类型。例如:int a[10];不能把浮点数据和整型数据同时放在数组a中。
- 用一个数组名和下标来唯一确定数组中的元素。例如:a[8]代表下标为8元素的值。
一维数组:
定义:
- 定义格式:类型说明符 数组名 [常量表达式];
说明:
-
类型说明符 :数组的类型。
-
数组名命名规则和变量名相同,遵循标识符命名规则。
-
常量表达式可以包括常量和符号常量,但不能包含变量。
-
常量表达式指明数组中元素的个数,必须大于零。例如:int a[0]; 是错误的。
-
数组名后是用方括号而不是圆括号。
初始化:
- 定义:在数组定义时为数组元素赋初值称为数组初始化。
- 在定义数组时对数组元素赋以初值。方法:将数组元素的初值依次放在一对花括弧内。例如:int a [10] ={2,3,4,6,7,66,77,88,99,100};
- 可以只给一部分元素赋值,其他按零来处理。例如:int a [10] = {2,3,4,5,6};表示只给前面5个元素赋初值,后5个元素值为0。
- 对全部数组元素赋初值时,可以不指定数组长度。例如:int a [5]={1,2,3,4,5};也可以写成int a []={1,2,3,4,5};
- 一维数组赋初值的个数不能超过数组总元素的个数。例如:int a [3]={1,2,3,4};就是错误的。
引用:
- C语言规定,只能引用单个数组元素,不能一次引用整个数组。
- 数组的引用形式:数组名 [下标]
- 下标是指在数组中第几个元素。例如:a[3]就是数组中序号为3的元素,它和简单变量地位和作用相似。
- 下标可以是整型常量,整型变量和整形表达式。例如:a[4],a[0],a[i+1]。
- 下标的值是数组元素序号,从0开始,到n-1结束。例如:int a[10];说明数组a有10个元素,分别为a[0],a[1],...,a[9]。
- 注意区分数组定义和数组元素引用。数组定义时有类型说明符。
输入输出:
- 可以对数组中任何一个元素进行单独的输入输出,每个元素等同于一个普通变量。
- 数组的引用离不开循环。将数组的下标作为循环变量,通过循环,就可以对数组的所有元素逐个进行处理。
- 数组的输入:
#include <stdio.h>
int main()
{
int a[10];
int i;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
...
return 0;
}
- 数组的输出:
#include <stdio.h>
int main()
{
int a[10];
int i;
for(i=0;i<10;i++)
printf("%d",a[i]);
...
return 0;
}
二维数组:
一般形式:
类型说明符 数组名 [常量表达式1] [常量表达式2];其中:常量表达式1为行数;常量表达式2为列数。例如:float a[3][4],b[5][10]。
注意:
-
一对方括号内不能写两个下标 。例如:float a[3,4]是错误的。
-
数组元素个数必须是常量表达式,不能使用变量。例如:int i=2;j=4是正确的;而int a[i][j]是错误的。
-
用于定义数组长度的常量表达式必须为大于零的正整数。例如:int a[0][4]是错误的。
理解:
二维数组可被看作一种特殊的一维数组:它的元素又是一个一维数组。例如:float a[3][4];可以把a看作一个一维数组,它有3个元素:a[0],a[1],a[2],每个元素又是一个包含4个元素的一维数组:a[0]---a[0][0] a[0][1] a[0][2] a[0][3]
a[1]---a[1][0] a[1][1] a[1][2] a[1][3]
a[2]---a[2][0] a[2][1] a[2][2] a[2][3]
初始化:
- 分行给二维数组赋初值。例如:int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};表示第一个花括号的值作为第一行元素的初值,第二个花括号的值作为第二行元素的初值,第三个花括号的值作为第三行元素的初值。
- 可以将所有数据写在一个花括号内,按数组元素在内存中的排列顺序对各元素赋初值。例如:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};表示将1,2,3,4作为第一行元素的初值,5,6,7,8作为第二行元素的初值,后四个数作为第三行元素的初值。
- 可以对部分元素赋初值。例如:int a[3][4]={{1},{5},{9}};表示只对该元素中每行的第一个元素赋初值,每行的后三个元素赋值为零。
- 可以对各行中的某一元素赋初值。例如:int a[3][4]={{1},{0,6},{0,0,0,11}};表示第一个花括号内只有一个值,相当于对第一行的第一个元素赋初值,后三个元素的值为零。第二个花括号中有两个值,相当于对第二行的第一,二两个元素赋初值,后两个元素的值为零。第三个花括号中有四个值,相当于对第二行的四个元素赋初值。
- 可以对某几行元素赋初值。例如:int a[3][4]={{1},{5,6}};只有两个花括号,表示只对前两行的某一些元素赋初值,第三行元素初值为零。
- 如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。例如:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};它等价于:int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。例如:int a[][4]={{0,0,3},{},{0,10}};表示第一维的长度为3.
引用:
- 二维数组元素的引用形式:数组名 [下标1] [下标2]
- 下标1和下标2可以是整型常量,整型变量和整形表达式。其编号从0开始。注意:下标不要越界。例如:若int a[2*4][3*3],i=10;则使用a[4][0],a[2][i-2]都是合法的。
- 数组名a代表的是数组a在内存中的首地址,可以用数组名a来代表数组元素a[0][0]的地址。数组名是常量,不可对它赋值。
输入输出:
- 二维数组有两个下标,故采用双重循环方式。
- 数组的输入:
#include <stdio.h>
int main()
{
int a[2][3],i,j;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
...
return 0;
}
- 数组的输出:
#include <stdio.h>
int main()
{
int a[2][3],i,j;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
printf("%5d",&a[i][j]);
...
return 0;
}
字符数组:
定义:
用来存放字符数据的数组是字符数组。C语言用字符数组存放字符串,字符数组中的各元素依次存放字符串的各字符。定义格式:char 数组名[常量表达式];例如:char c[6];c数组具有6个元素,可以存放长度小于或等于5的字符串。
存储:
例如:char c[10]="c program";该数组在计算机中存储的形式如下图所示:
c[9]存储'\0',它作为字符串的结束符出现,正因为如此,要为'\0'留位置。强调:字符串实际占有单元的数量等于字符串长度+1,定义时注意考虑元素总个数应比实际长度多1.
初始化:
- 用单个字符对字符数组初始化。例如:char c[10]={'c',' ','p','r','o','g','r','a','m','\0'};把10个字符依次赋给c[0]~c[9]这10个元素。用这种初始化需要说明的是:
1)如果在定义字符数组时不再进行初始化,则数组中各元素的值是不可预料的。
2)如果花括号中提供的初值个数(即字符个数)大于数组长度,则出现语法错误。
3)如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。
4)如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即'\0')。
- 用字符串常量对字符数组初始化。例如:
1)char str[6]={"CHINA"};
2) char str[6]="CHINA"; //省略{}
3)char str[]="CHINA"; //省略长度值
4)char c[12]={"how are you"};与char c[]={'h','o','w,' ','a','r','e',' ','y','o','u','\0'};等价。
- 说明:
1)将字符串存储到字符数组中,字符串和第一个'\0'构成有效字符串。对字符串的操作,就是对字符数组的操作。
2)普通数组中的元素是确定的,一般用下标控制循环;而字符串使用结束符'\0'来控制循环。
输入输出:
- 单个字符输入输出(用格式符%c或字符输入函数)
#include <stdio.h>
int main()
{
char c[5];
int i;
for(i=0;i<5;i++)
scanf("%c",&c[i]);
for(i=0;i<5;i++)
printf("%c",c[i]);
printf("\n");
return 0;
}
- 字符串整体或部分输入输出(用格式符%s)。例如:
char str[6];
scanf("%s",str);
说明:1)输入输出项必须是以字符串的地址形式出现;
2)也可以是字符串常量:printf("%s\n","book");
3)只能输入不包括空格,\t和\n的字符串;
4)若要输入空格,用gets函数;
5)数组名前不加&符号。
例如:
char str[10];
scanf("%s",str);
printf("%s\n",str);
/*当输入:how are you <回车>
会输出:how
当采用'%s'输入时,scanf不能输入空格,输出的信息只有how,因此这里不能采用scanf来输入带有空格的字符串。用%s输出字符串时,从输出项提供的地址开始输出,直到遇到字符串结束串'\0'为止。*/