数组是内存中连续存储的有相同类型的数据的有序集合,是一种构造类型。
定义方式 :类型 数组名[元素个数];(要好好记住定义方式便于后续复杂类型数组的理解)
不要认为a[i]代表数组元素的值,它代表数组元素本身,可作为左值使用。
数组的初始化方式
完全初始化:inta[10] = {0,1,2,3,5,6,7,8,9};
部分初始化:intb[10] = {8,1};
默认初始化:intc[] = {1,2,3,4};//系统根据初值个数确定数组长度
注意char c3[]={'H','a','p','p','y','\0'};后面必须加\0不应该这样写char c2[]={'H','a','p','p','y'};如果%s的格式输出c2则会有垃圾数据产生
数组特点
存储空间连续;
元素之间有序;
元素类型相同;
元素个数固定(除了在堆上分配);
数组元素无名;
数组名代表了数组的首地址,它具有特定的数据类型,一定是个常量
访问素组元素
数组不能以整体形式参与数据处理,只能逐个使用数组元素。
sizeof(数组) = 数组所占内存大小 strlen(字符数组)=从开始到‘\0’
数组越界有可能修改其他变量的值,比如先定义一个int然后再定义一个数组a[n],那么a[n]便是指向之前定义的那个int
数组与指针
数组名代表数组的首地址,是不可修改的常地址。指针只不过是模仿下数组的作用而已
多维数组
C语言将多维数组的访问变成了多次对一维数组的访问。
C语言只能处理一维的数组.
对二维数组,C语言进行了一次“降维”处理。即将二维数组视为一个特殊的一维数组,它的每个元素都是个一维数组。
二维数组初始化:
1.按行分段赋值。例如:inta[3][4]= { {1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
2.将所有的初值写在一个大括号内,按数组元素的排列顺序对各个元素赋初值。
3.可以对数组部分元素赋初值。例如:inta[3][4]={{1},{5,6},{9}};
4.如果对数组的全部元素都赋初值,则定义数组时可以不指定数组的第一维长度,但第二维长度不能省略。int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};
二维数组与指针
假设定义了inta[4][5] 那么:a+2表示第二行的地址 *(a+2)第2行第0列元素的地址。*(*(a+2))第2行第0列元素。
二维数组的三种视角若定义inta[4][5];
1. 可视为一个二维数组。
2. 可视为由四个一维数组元素组成的一维数组,每个元素的类型是int[5]的数组类型。
3. 可视为纯粹由20个整型元素组成的一维数组;不同的视角界定了数组元素的访问方式,但无论以什么视角,它们在内存中的存储形式都是一样的。
函数与数组
当数组作为函数的参数进行传递时,该数组自动退化为指针。