数组(Array)
数组:一组具有相同数据类型的数据的有序集合
6.1 一维数组
6.1.1 一维数组的定义
一般格式:
类型说明符 数组名[常量表达式];
例如,int[10]
定义了一个整形数组,数组名为a,包含10个元素
注意:
(1)数组名命名规则和变量相同
(2)在定义数组时,需要指定数组中元素的 个数,即数组长度。
注意数组元素的下标是从0开始的
a[0] a[1] a[2] a[3] a[4]
a[5] a[6] a[7] a[8] a[9]
(3)常量表达式可以包括常量和符号常量, 但不能包含变量。C语言不允许对数组的大小作动态定义。例如,下面这样定义数组是不行的:
int n;
scanf(“%d″,&n);
int a[n];
6.1.2 一维数组在内存中的存放
一维数组
int a[10]={1,2,3,4,5,6,7,8,9,10};
数组元素1,2,3,…,10从低地址a[0]开始向高地址a[9]依次存放。
每个数据元素所占字节数就是基类型字节数。
这句话的意思是,每个数组元素1,2,3…所占字节数为数组的类型int所占字节数,即sizeof(int)
6.1.3 一位数组的引用
引用方式
数组名[下标]
下标可以是整型常量或整型表达式
例如:
a[0]= a[5]+ a[7]- a[2*3]
#include<stdio.h>
int main()
{
int i, a[10];
for (i = 0; i < 10; i++)
a[i] = i; //将i的值赋给a[1]
for (i = 0; i < 10; i++)
printf("%d ", a[i]); //输出数组a的每个元素
return 0;
}
6.1.4 一位数组的初始化
(1)在定义数组时对数组元素赋以初值。
int a[10]={0,1,2,3,4,5,6,7,8,9};
经过上面的初始化后
a[0]= 0 a[1]= 1 a[2]= 2 a[3]= 3 a[4]= 4
a[5]= 5 a[6]= 6 a[7]= 7 a[8]= 8 a[9]= 9
(2)可以只给一部分元素赋值。
int a[10]={0,1,2,3,4};
只给前面5个元素赋初值
(3)在对全部数组元素赋初值时,可以不指定数组长度。
int a[5]={1,2,3,4,5};
可以写成
int a[]={1,2,3,4,5};
例,用数组来处理,求解Fibonacci数列
#include<stdio.h>
int main()
{
int i, f[20] = {
1,1 };
for (i = 2; i < 20; i++)
f[i] = f[i - 2] + f[i - 1];
for (i = 0; i < 20; i++)
{
if (i % 5 == 0) printf("\n");
printf("%12d", f[i]);
}
printf("\n");
return 0;
}
运行结果
6.2 二维数组
6.2.1 二维数组的定义
一般形式为
类型说明符 数组名[常量表达式][常量表达式];
例如:
float a[3][4],b[5][10];
可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。
6.2.2 二维数组在内存中的存放
数组元素在内存中按行存放,即先顺序存放第零行的元素,再存放第一行的元素,再存放第二行的元素…
int b[3][3] = { {1,2,3}, {4,5,6}, {7,8,9} };
6.2.3 二维数组的引用
二维数组元素的表示形式为:
数组名[下标][下标]
例如:
a[2][3]; a[2-1][2*2-1];
数组元素可以出现在表达式中,也可以被赋值,例如:
b[1][2] = a[2][3] / 2
在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内
6.2.4 二维数组的初始化
(1) 分行给二维数组赋初值。
int a[3][4] = {
{1,2,3,4},{5,6,7,8},{9,10,11,12}};
(2) 将所有数据写在一个大括弧内,按数组排列的顺序对各元素赋初值。
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
(3) 可以对部分元素赋初值。
int a[3][4] = {
{1},{5},{9}};
[ 1 0 0 5 0 0 9 0 0 ] \left[\begin{matrix} 1&0&0\\ 5&0&0\\ 9&0&0\\ \end{matrix}\right] ⎣⎡