知识点总览:
目录
数组
概念:数组是一种用来存储相同类型的元素序列的数据结构。它是一组相同类型的变量的集合,这些变量在内存中是连续排列的。每个数组元素都有一个唯一的索引,可以用来访问该元素。
一维数组
一维数组的创建和初始化
一维数组创建的基本语法:
type arr_name [常量值]
type:指的时数据类型 如int char....等内置类型。 也可以是自定义类型.
arr_name:自己定义 符合实际意义就行
[]内一定要是常量值 不能是变量 如下面这种创建数组是不允许的
int main()
{
int n=0;
int arr[n];
return 0;
}
由于n是变量,会产生语法错误
一维数组的初始化:
不完全初始化:
数组进行不完全初始化,这意味着只初始化数组的一部分元素,而其他元素则保持未初始化状态。这种情况下,未初始化的元素会自动被设置为0(对于数字类型)或者空字符(对于字符数组)。
代码实例:
完全初始化:
数组进行完全初始化,意味着数组将会初始化数组的全部元素。花括号中的元素个数需要与数组的元素个数相匹配。如果为匹配要么出现数组的越界访问 要么是不完全初始化。
代码示例:
int main()
{
int arr[5]={1,2,3,4,5};
return 0;
}
一维数组的使用
1.数组下标
数组的下标(也称为索引)用于访问数组中的元素。数组的下标从0开始,因此第一个元素的下标为0,第二个元素的下标为1,以此类推。
例如,如果有一个名为arr
的整型数组,要访问第三个元素,可以使用下标为2,因为数组的下标是从0开始的。
int arr[5] = {10, 20, 30, 40, 50};
int thirdElement = arr[2]; // 访问第三个元素,下标为2
在上面的代码中,arr[2]
表示数组arr
中的第三个元素,它的值为30。
需要注意的是,数组下标应该是非负整数,且不能超出数组的范围。如果使用超出范围的下标访问数组,将会导致未定义的行为,可能会访问到未知的内存区域,这可能导致程序崩溃或者产生不可预测的结果。
2.数组元素打印
通过循环遍历的方式进行打印,就是通过数组的下标对数组中的每一个元素进行访问.
代码实例:
3.数组的输入
数组的输入同样是通过循环遍历的方式进行。
一维数组在内存中的存储
一维数组在内存中是连续存储的,即数组中的元素在内存中是相邻存储的,依次排列在一起。数组的存储顺序是按照元素的顺序来排列的,即第一个元素存储在数组的起始位置,第二个元素存储在第一个元素的后面,依此类推。下面我们通过地址进行观察
代码示例:
输出结果:
000000772EEFF7F8
000000772EEFF7FC 地址是以16进制进行打印的
000000772EEFF800 我们不难发现每个地址相差4
000000772EEFF804 4代表的是4字节也就是int类型的大小
000000772EEFF808
通过地址我们可以发现 地址的跳越是与数组所存的元素类型有关.
sizeof计算数组元素个数
sizeof的作用:
是一个在C语言中非常重要的操作符,用于计算数据类型或变量所占内存的大小(以字节为单位)。它可以用于任何数据类型、变量或表达式。
代码示例:
arr数组所存元素类型为整型,整型所占内存大小为4字节,该数组能存5个整型,所以该数组所占内存大小为20字节
通过上面对sizeof的基本用处有所了解,我们就可以通过sizeof来进行计算数组元素个数:
代码示例:
在这个例子中,sizeof(arr)
计算出数组arr
的总大小,sizeof(arr[0])
计算出数组中第一个元素的大小(这个大小和整型的大小相同),然后将数组的总大小除以单个元素的大小,得到数组中元素的个数。
需要注意的是,这种方法要求数组已经被定义,因为只有在数组已经定义后,sizeof(arr)
才能正确地计算数组的总大小。
二维数组
二维数组是C语言中的一种数据结构,它是由一组行和列组成的矩阵形式的数组。每个元素由两个索引值确定,一个用于指定行,另一个用于指定列。二维数组中的每一行都是一个一维数组。
二维数组的创建
声明数组:首先,需要声明一个二维数组,指定数组的行数和列数,以及数组元素的数据类型。
二维数组声明的基本语法:
type arr_name[rows][cols];
其中,type
是数组中元素的数据类型,arr
是数组的名称,rows
和 cols
分别是数组的行数和列数。
二维数组的初始化
不完全初始化:
int arr[5][5]={0};
剩下未初始化的位置,自动用整型0补齐
完全初始化:
int arr[2][2]={1,2,3,4};
因为该数组是两行两列,说明该数组一共用四个整型元素则可以将其完全初始化
元素是将每行放满后 在将剩余的元素放入下一行
该数组中的元素分布可以直观的将其看成:
第一行 1 2
第二行 3 4
按照行进行初始化:
代码通过{}进行每行的分隔,不会在上面一样,一次将元素放入数组中
代码示例:
观察右边的调试窗口,我们可以发下1,2放入第一行,第一行中第三列没有值放入,系统将其自动初始化为0,下面几行亦是如此。
注:二维数组定义是列是必须给定常量值,但行是可以不给常量值的
如:
int arr[][]={0};//这样编译器会报错
int arr[][5]={0};//这样编译器不会报错
因为行可以通过给定的元素个数进行推断。但是不给列系统不知道你要在第一行放入多少元素
则会报错.
二维数组的使用
下标:
二维数组的下标包含两个部分,分别用于指定行和列。下标的基本用法如下:
arr[row][column]
其中,arr
是二维数组的名称,row
是行索引,column
是列索引。行索引和列索引都是从0开始的整数,用于指定二维数组中的特定元素。
例如,对于一个名为 matrix
的二维数组,要访问第二行第三列的元素,可以使用下面的语法:
int element = matrix[1][2];
二维数组的输入与打印:
代码示例:
//二维数组的输入
int main()
{
int arr[5][5];
int row = 0;//控制行
int column = 0;//控制列
printf("请输入你需要打印的值:\n");
for (row = 0; row < 5; row++)//外层循环控制行
{
for (column = 0; column < 5; column++)//内层循环控制每列 每行的每个元素都可以接收到
{
scanf("%d", &arr[row][column]);
}
}
//打印同理 取到数组所有元素即可
printf("该数组中的元素为:\n");
for (row = 0; row < 5; row++)
{
for (column = 0; column < 5; column++)
{
printf("%d ", arr[row][column]);
}
printf("\n");//打印完每行换行
}
return 0;
}
输出结果:
请输入你需要打印的值:
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
该数组中的元素为:
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
注:输入的格式不需要按照每行进行输入,全部输入在同一行也可以得到相同的结果
二维数组在内存中的存储:
int arr[3][3]={0};
我们直观的认为该数组中的元素分布是:
下面我们通过观察其地址了解其分布:
不难发下其还是连续的 应该是这样进行分布:
每个数组元素都按顺序存储在内存中,第一行的元素按顺序存储在前面,然后是第二行的元素。因此,数组的存储顺序是按行存储的,每一行的元素是连续的。
变长数组
C99标准引入了变长数组(Variable Length Arrays,VLA),允许在运行时动态指定数组的大小。这与传统的C语言中,数组的大小必须是编译时确定的方式不同。
使用变长数组,可以更灵活地处理需要动态大小的数组,例如需要根据用户输入来确定数组大小的情况。
注:1.数组长度只有在运行时才能确定,所以变长数组不能初始化!!
2.vs2022不支持该特性,只有在gcc编译器上可以进行测试,使用dev c++可以进行测试