数组是一组相同类型元素的集合(能与数学中的集合联想起来理解)。主要目的之一是能够批量存储多个相同类型的数据,让其更容易解决批量操作的问题。
1.放1个或多个数据,但元素个数不为0。
2.存放多个数据,类型相同。
数组有一维数组和多维数组。
1.创建
type arr_name[常量值];
数组的值称数组的元素。
可指定数组的大小和数组的元素类型。
type指定数组存放数据类型,这类型可以是我们常见的类型也可以是我们自定义的类型。
arr_name指数组的名称,可以与变量一起理解(最好把一个数组名起的有意义)
[]中常量值指定数组的大小,可以跟据实际情况指定大小需求。
[]下标操作符里能填整数常量表达式,整数变量,枚举常量(在支持的编程语言中)
2.初始化
type arr_name[常量值]={数据}
数组的初始化是用{}(大括号)跟变量的初始化差不多,所以最好是记得初始化,不要忘记。
1.说到数组的使用就不得不提(下标引⽤操作符:[]),这就是数组访问的操作符
比如一个数组:
int arr[10]={1,2,3,4,5,6,7,8,9,10};
每一个元素都有一个下标,这都是从0开始数的,比如就像上面有10个元素,它们的下标不是1到10而是0到9,这是与我们习惯上不同的一个点需要牢记。
int arr[10]={1,2,3,4,5,6,7,8,9,10};
访问arr数组中的2,
arr[1]
2.数组打印
想要数组打印,这里我们就需要循环(for)来操作了。
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
for (i; i < 10; i++)
{
printf(" % d", arr[i]);
}
return 0;
}
3.数组的输入
想要数组的输入,这里我们就要加上scanf这个函数了。
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
for (i; i < 10; i++)
{
scanf_s("%d", &arr[i]);
}
for (i; i < 10; i++)
{
printf("%d", &arr[i]);
}
return 0;
}
scanf在vs中是以scanf_s形式,若不想报错则需在上面加# define _CRT_SECURE_NO_WARNINGS
数组在内存中是连续存放的,这个连续增长与数组的类型有关,当数组类型为int类型,每个数组中的元素在内存中都有一个地址,因为int类型是4个字节,所以随着下标增长,地址也很会变(以4个字节一次一次变)
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
for (i; i < 10; i++)
{
printf("&arr[%d]=%p\n", i, & arr[i]);
}
return 0;
}
sizeof一个很好计算数组个数的工具,它在C语言中是一个关键字,可计算类型大小,也可计算数组大小。
例如:
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d\n", sizeof(arr));
//元素个数
int ret = sizeof(arr) / sizeof(arr[0]);
printf("%d", ret);
return 0;
}
一维数组中将其中数据看作元素,二维数组则是将一位数组看作元素,依次类推,多维数组则是将前一个数组看作元素的数组。
type arr_name[常数值1][常数值2];
第一个[]表示行,第二个[]表示列。
二维数组的初始化大致与一维数组相同,但有一个不同点,初始化时省行不省列
int arr[][5]={1,2,3,5,4};
这样的才行。
1.完全初始化
int arr4[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
2.按行初始化
int arr4[3][5] = { {1,2},{3,4},{5,6} };
数据中的{}(大括号)是指行。
二维数组的使用与一维数组差不多,主要是多出来一个行。行,列下标都是从0开始。
例如:
int main()
{
int arr4[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
printf("%d\n", arr4[2][4]);
return 0;
}
二维数组的输出与输入:
既然一维数组需要循环(for),那么二维数组就要两个循环了(多出了个行);
例如:
int main()
{
int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
int i = 0;
输出
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
scanf("%d", &arr[i][j]);
}
}
输入
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
二维数组与一维数组差不多,都是连续存放。二维数组是一行一行顺序加上去的
例如:
int main()
{
int arr[3][5] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
}
}
return 0;
}
在 C99 标准中引入了变长数组(Variable - Length Array,VLA)。所谓的变长数组,我们可以理解为它将[]中的常量值改为了一个变量可以在外面通过改变n来改变数组大小。因此变长数组不能初始化。