数组
-
Array数组是有限的有序元素集合
-
数组元素的顺序集合
-
一个数组中所有元素的类型是相同的
-
数组的长度即数组元素的个数
-
数组中的元素通过下标来进行访问的
一维数组
定义
Type ArrayName[ARR_LEN];
- sizeof(ArrayName)/sizeof(ArrayName[0]) 得到数组的 长度
-
ARR_LEN 即数组长度 元素的个数 变量的个数
-
必须是非负整数
-
如果ARR_LEN是整型常量表达式,则可以直接初始化
-
如果ARR_LEN不是常量,则不能直接初始化( = {})
-
称为 可变长数组
-
可变长数组不是指数组长度可以变化 ,而是指定义该数组中,数组长度是一个整型表达式(非常量)
-
-
可变长数组不能在全局作用域中定义,可变长数组也不能声明为static
-
-
如果在定义数组中ARR_LEN不指明,则必须直接初始化
int arr[] = {1,2,3,4,5};
-
数组的长度取决于初始化器{}中元素的个数
-
-
数组一旦定义,数组长度不可以改变
-
初始化
-
初始化器{元素,元素,...}
int arr[5] = {1,2,3,4,5}; int brr[5] = {1,2,3,4,5,6}; //编译警告 int crr[5] = {1,2}; //后面补0 int drr[5] = {0}; //全部为0 int err[5] = {}; //全部为0 int frr[5] = {[2]=1,[4]=2}; //指定初始化 其余0 int grr[] = {1,2,3,4}; int n = 0; scanf("%d",&n); int hrr[n]; void func(int n){ int arr[n]; }
数组元素访问
-
数组中的元素是通过下标访问的
ArrayName[index]
-
通过下标,可以访问数组中的元素,也可以修改数组中的元素的值
-
下标运算符[],本质是指针偏移解引用
ArrayName[index] === index[ArrayName] *(ArrayName + index)
-
index下标从0开始,到 ARR_LEN -1 (数组长度-1)
-
如果超过[0,ARR_LEN-1] 范围,则数组越界访问,非常危险的
-
-
一维数组作为参数传递
void func(int arr[],int len){ //(int *arr,int len) } int arr[10]; func(arr,10); //传递数组名和数组长度
再议数组名
-
数组名是常量,
-
通过sizeof(数组名) == 得到数组内存大小
-
数组名 内存地址
&arr[0] 数组第一个元素的内存地址 首元素内存地址 &*(arr + 0) == &*arr == arr
-
数组名即数组首元素内存地址
-
在调用函数把数组名作为实参传递时,事实上传递了 &arr[0]数组第一个元素的内存地址
-
所以,在形参列表中的 数组,本质就完全退化为指针,这个时候sizeof(形参数组) == sizeof(指针)
-
-
数组名 以及 对数组名取址
&arr[0] arr &arr 以上三个值相等,区别在于类型不相等 &arr[0]和arr 类型为 TYPE * &arr 类型为 TYPE (*)[ARR_LEN] &arr[0]+1 和 arr+1 实际 + sizeof(TYPE) &arr+1 实际 + sizeof(arr)
二维数组
-
二维数组可以理解为行列矩阵,但实际上二维数组依然是连续的有序元素集合
-
二维数组 本质上 是一维数组 ,只是一维数组中的元素是 一维数组
定义
TYPE ArrayName[ARR_LEN1][ARR_LEN2]; ARR_LEN1 即二维数组中的长度 行 ARR_LEN2 即二维数组中元素(一维数组)的长度 列
初始化
int arr[4][5] = {{1,1,1,1,1},{2,2,2,2,2},{3,3},{4,4}}; int brr[3][4] = {1,2,3,4,5,6}; int brr[4][5] = {[1] = {1,2,3,4},[2][3]=1,[3][0]=5}; int crr[][3] = {1,2,3,4,5,6,7}; //3 int drr[][3] = {{},{1,2},{1},{}}; //4
-
二维数组在定义时,一维长度不能省
-
二维数组的二维长度 = sizeof(ArrayName)/sizeof(ArrayName[0])
-
二维数组的一维长度 = sizeof(ArrayName[0])/sizeof(ArrayName[0] [0])
二维数组中元素的访问
-
通过两个下标进行访问
ArrayName[二维下标][一维下标] ArrayName[行][列] int arr[4][5] = {}; int ret = arr[1][7]; //数组有越界吗?没有越界
-
二维数组作为参数传递
void func(int (*arr)[10],int len){ } void goo(int (*arr)[],int row,int col){ int (*brr)[col] = arr;//这样才能用 } int arr[5][10]; func(arr,5); int brr[6][8]; goo(arr,5,10); goo(brr,6,8);