4 数组
4.0 概述
C的数组,是存储固定数量的按顺序排列的同种类型的数据容器
数组的构成
类型,变量名称,数组长度,初始化成员
如:
int arrName[5] = {1,2,3,4,5};
4.1 数组的定义
int arrNum[5];
//定义一个5个int的数组普通做法
//数组中的内容是随机的,根据当前内存中的内容会有不一样的值
int arrNum2[] = { 1, 2 };
//不明确指定数组长度,但是编译器会根据{}里面的数量来确定
int arrNum3[3] = { 1 };
//定义一个3个元素的数组,只指定第一个元素的值,其它为未初始化(一般来说会是0,但不可依赖于这个假设)
FILE arrUserType[6];
//用户自定义类型的数组,
int arr2d[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
//定义二维数组,定初始化所有元素
int arr2d1[2][3] = { 1, 2, 3, 4, 5, 6 };
//从这个初始化表明二维数组和的排列是顺序的
int arr2d2[2][3] = { 1 };
//只初始化一个元素,arr2d2[0][0]
int arr2d3[2][3] = { { 1, 2 }, { 4, 5 } };
//此二维中每个二级数组只初始化前两个元素
int arr2d4[2][3] = { { 1, 2 } };
//只初始化第一个二级数组中的前两个成员
int arr2d5[][3] = { { 1, 2, 3 }, { 2,3,4} };
//不批定第一个索引,编译器自己计算
4.2 数组的长度
int iLen = 5;
int arr11[iLen];//无法通过编译,因为数组长员只能使用常量
const int iLenConst = 5;
int arr12[iLenConst];
4.3 数组的越界
C语言的数组是定长的,
假设长度是N,那最大的可用索引是N-1
如int arrNum[3];
使用数组中最后一个元素的方式是arrNum[2];
对于N-1,这个-1常常是被忽略的错误
数组越界后,程序并不会立即崩溃
但引发的问题是不可预估的
因为你引用了未知的内存
int arrNum[5] = {0};
printf("out of range:arrNum[5]=%d\n",arrNum[5]);
arrNum[5] = 1;
4.4长度为0的数组(黑科技)
有时候会定义长度为0的数组
一般出现在结构体的尾部
这是用于使用一个变长的缓冲区
利用于数组越界访问不会出错这个特性
int arrZero[0];//单
struct tagMyTrailArr{
int iNum;
int arrZero[0];//在结构体中可以定义长度为0的数组
}MyTrailArr;
不建议主动在项目中使用此技术
4.5数组的遍历
//遍历一维数组
int arrNum[5];
int arr2d[2][3];
for (i = 0; i < 5; i++){
arrNum[i] = 0;
}
//使用二级循环遍历二维数组
for (i = 0; i < 2; i++){
for (j = 0; j < 3; j++){
arr2d[i][j] = 0;
}
}
//使用指针可以用一个循环遍历二维数组
int arr2d[2][3];
int * pArr2d = (int*)arr2d;
for (i = 0; i < 2*3; i++){
pArr2d[i] = 8;
}
printf("element in arr2d:%d\n", arr2d[1][2]);