萌新的学习笔记,写错了恳请斧正。
目录
什么是数组
一维数组
一维数组的创建与初始化
创建
初始化
数组的类型
数组的取用
数组下标
下标引用操作符
数组的输入与输出
输入
输出
一维数组在内存中的存储
获取数组元素的个数
二维数组
二维数组的创建
初始化
不完全初始化
完全初始化
按行初始化(完全)
按行初始化(不完全)
初始化只能省略行不能省略列
二维数组的取用
二维数组的输入输出
二维数组在内存中的存储
变长数组(VLA)
数组是一组相同类型元素的集合
数组分为一维数组和多维数组,多维数组一般只用二维
一维数组的创建方法如下:
type arr_name[常量];
type规定数组元素的类型,如char、int、short等等
arr_name就是我们自己起的数组名
方括号中的常量用来规定数组的大小,即元素容量
比方说可以这样创建数组:
int a[4];
short b[5];
char c[6];
在数组创建时,我们可以直接给予一些初始值:
//完全初始化
int arr[4] = {1, 2, 3, 4};
//不完全初始化
int abc[3] = {6};
//错误的初始化,溢出
int aaa[2] = {1, 2, 3}
//不给常量的初始化
int hhh[] = {1, 1, 4}
不完全初始化时,数组从前往后获取元素,未被初始化的元素默认为0
初始化如果不给常量,就会根据所给的元素数量自动确定数组大小
一旦数组大小被确定就无法更改!!!
数组本身是有类型的,是一种自定义类型
我们创建数组的语句把其中的数组名去掉就是数组的类型
比如说:
char ch[10]; //此数组类型为 char [10]
int num[5]; //此数组类型为 int [5]
long lnum[7]; //此数组类型为 long [7]
数组中每一个元素都有一个“门牌号”,称为数组下标
数组下标从0开始,即数组第一个元素的编号为0,随后为1、2、3……
所以大小为n的数组最大编号为n-1
C语言提供了一个操作符用于提取数组中的元素,即一对英文方括号
下标引用操作符用于提取数组中的元素,用法如下:
a = arr[3];
此处便是将arr数组中数组下标为3的元素(第四个)赋值给了a
一般我们会通过for循环来执行数组的输入输出
for (int i = 0; i < n; i++) //n为数组长度
scanf("%d", arr[i]);
for (int i = 0; i < n; i++)
printf("%d", arr[i]);
一维数组在内存中线性递增的存储
也就是说,数组的每一个元素在内存中紧挨着依次增加
比方说一个int数组,第一个元素地址为10000000,第二个为10000004,随后是10000008、1000000C、10000010……我们发现,每两个元素间相差4字节,这正好是int类型的长度。
我们可以使用之前提到的sizeof来获取数组的大小,而我们又知道数组每个元素的大小,那么相除就得到了数组元素的个数。如下为int数组元素个数:
sizeof(arr) / sizeof(arr[0])
sizeof(arr) / sizeof(int)
上面两种皆可,第一种比较泛用。
二维数组可以理解为以一维数组为元素的数组
更高维度的以此类推
type arr_name[常量1][常量2];
与一维数组类似,常量1代表行数,常量2为列数
也可以理解为[常量1]个类型为arrname[常量2]的一维数组集合成的数组
从前往后填充,先填完第一个一维数组再填第二个,后面补0
int arr[3][5] = {1,2};
int arr[3][5] = {1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};
int arr[2][3] = {{1,2,3},{4,5,6}};
每个一维数组剩下的补0
int arr[2][3] = {{1,2},{4,5,6}};
int arr[][5] = {{1,2,3,4,5}, {3,4}, {5,6,7}};
与一维数组类似,行列都从0开始
a = arr[1][2];
上方即为把arr数组的第二行第三列赋值给a
与一维类似,多嵌套一个for循环即可,内外循环分别遍历行号与列号,不赘述
与一维数组一致,二维数组元素也连续存放
二维数组中的每个一维数组间没有空隙
C99标准中引入了变长数组的概念
即可以使用变量来创建数组
这样,数组的大小在编译时不会被确定,而是在运行时确定
注意:变长数组不是说数组长度可变。被确定大小后,无论那个变量再变成啥,数组的长度也不会改变了。
另外:Visual Stodio采用msvc编译器,不支持变长数组(但可以利用malloc来达到相同的目的)
gcc编译器支持变长数组