目录
一、初探程序中的数组
1.数组的概念
2.数组的定义
3.数组元素的访问
二、数组特性深入剖析
1.数组的初始化
2.数组的内存分布
三、多维数组
1.多维数组的定义
2.数组类型
3.二维数组
4.多维数组初始化注意事项
数组是相同数据类型变量的有序集合
—数组作为整体需要一个合法的命名(数组名)
—数组中的变量没有独立命名,只有在数组中的编号
—数组中的变量数量是固定不变的(数组大小固定)
语法:tpye Name [ size ]
示例:
int arr1[10]; //定义名为 arr1 的数组
//数组中一共有 10 个元素
//每个元素的类型为 int
double farr[5]; //定义名为 farr 的数组
//数组中一共有 5 个元素
//每个元素的类型为double
a.通过数组名 [下标] 的方式来访问元素
b.数组是一个有序的集合,每个元素有固定的下标
c.数组元素下标固定从0开始(可以使用变量作为下标)
示例:
int arr1[3];
arr1[-1] = 0; //ERROR
arr1[0] = 1;
arr1[1] = 2;
arr1[2] = 3;
arr1[3] = 4; //ERROR
注意事项:
1.只有整型数才能作为数组的下标访问元素
2.下标越界是一种非常严重的编辑错误(工业级BUG来源)
3.下标越界带来的后果可能不会立即体现
—语法:type Name [N] = { V0, V1, ... , Vn-1};
—意义:将数组中的元素分别初始化为 V0, V1, ... , Vn-1
int main ()
{
int arr[5] = {2,4,5,5,6};
int i = 0;
for (i = 0 ;i<5 ;i++)
{
printf("arr[%d] = %d \n", i, arr[i]);
}
return 0;
}
数组初始化技巧
(1)自动确认数组大小
type Name [] = {V0, V1, ... , Vn-1};
(2)将部分数组元素初始化为0
/* s < N ,未指定初始值的元素默认为0*/
type Name [N] = {V0, V1, ... , Vs};
(3)将全部元素初始化为0
type Name [N] = {0};
数组在计算机底层是一片连续的内存,用于储存数组元素
—数组的大小字节数可以用sizeof()获取(单位为字节)
计算数组大小
type Name [] = {V0, V1, ... , Vn-1}; // 一共n个元素
sizeof(Name)/ sizeof( Name[0] ); // 计算结果为n
注意:
1.数字名只能作左值使用(可以看作常量)
2.只能使用整型常量对数组大小进行定义
3.只能使用整型值对下标访问数组元素
int size; //初始值多少?
int arr[size]; //数组大小多少?
int a[5] = {0};
arr[1.5] = 1; //第1.5个变量是哪个
arr = a; //常量不能作左值
多维数组的定义格式是:
数据类型 数组名称[常量表达式1][常量表达式2]…[常量表达式n];
定义了一个名称为num,数据类型为int的二维数组。其中第一个[3]表示第一维下标的长度,就像购物时分类存放的购物;第二个[3]表示第二维下标的长度,就像每个购物袋中的元素。
多维数组的初始化与一维数组的初始化类似也是分两种:
(1)数据类型 数组名称[常量表达式1][常量表达式2]…[常量表达式n] = {{值1,…,值n},{值1,…,值n},…,{值1,…,值n}};
(2)数据类型 数组名称[常量表达式1][常量表达式2]…[常量表达式n]; 数组名称[下标1][下标2]…[下标n] = 值;
数组类型
-数组类型由元素类型和数组大小共同决定
-数组类型的具体表现形式为 : type [N]
int a[10] = {0}; //类型:int [10]
float b[5] = {0}; //类型:float [5]
int aa[5] = {0}; //类型:int [5]
float bb[8] = {0}; //类型:float [8]
int c[10] = {0}; //类型:int[10]
int i;
for(i=0;i<10;i++)
c[i]= a[i]; //相同类型数组的“赋值操作!
数组中的元素可以是变量,也可以是其他程序元素
当数组中的元素是另一个数组时,就构成了多维数组
C语言中的二维数组定义:tape Name [N1] [N2];
二维数组可以看作数学中的矩阵:
示例
int a[3][4]; //定义一个数组,数组中有 3 个元素
//每个元素的类型为 int[4]
a[1][2]= 2; //对第 1 个数组中的第 2 个变量赋值
a[2][3]= 2; //对第 2 个数组中的第 3 个变量赋值
a[3][0]= 2; //越界
a[0][4]= 2; //越界
注意:
— 二维数组的本质还是数组,即:数组中的每一个元素是数组!!!
— 二维数组能且仅能让编译器自动确认第一维
多维数组初始化要注意以下事项:
采用第一种始化时数组声明必须指定列的维数。mtianyan: 因为系统会根据数组中元素的总个数来分配空间,当知道元素总个数以及列的维数后,会直接计算出行的维数;
采用第二种初始化时数组声明必须同时指定行和列的维数。
二维数组定义的时候,可以不指定行的数量,但是必须指定列的数量。