C语言基础(09)【数组的概念 与一维数组】
数组
数组的概念
什么是数组
数组是相同类型、有序数据的集合。
数组的特征
- 数组中的数据称之为数组的元素(数组中的每一个匿名变量空间,是同构的)
- 数组中的元素存放在内存空间建立。
衍生概念:下标(索引)
- 下标或者索引代表了数组中元素距离第一个元素的(首地址所在元素)偏移量。举例:第一个元素距离第一个元素的偏移量为0,所以数组的下标是从0,开始的
- 数组中元素的地址值下标越大地址值越大。(每一块内存空间都有一个独有的内存地址,内存中每8个bit也就是1个字节编一个号,这个号就是我们所说的内存地址)数组的下标是从0开始的。
- 数组中元素的地址值,下标越大,地址值越大。(每一块内存空间都有一个独有的内存地址, 内存中每8个bit也就是1个字节编一个号,这个号就是我们所说内存地址)
int a,b,c,d;====int a [4]
一维数组
数组的定义
语法:
类型说明符/数据类型 数组名 [数组的容量]
说明:
- 数组的类型说明符由数组中的元素所决定的,类型说明符也就是数据类型,元素是什么类型,数组就是什么类型,数组就是什么类型。同一个数组中,数组中所有类型都是一致的。
- 数组名也是标识符,我们所说的数组(名),大家可以理解为数据类型是数组的变量(名)。命名规则与变量名相同,遵循标识符的命名规则
- 数组容量也可以叫做常量表达式或者元素个数,其值必须为整型,可以包含常量和符号常量, 但不能是变量。
int size = 10;
int arr[size];// 这里永远是10,因此此时数组的内存已将申请,此时数组的大小就是10,并不会因为后面对
size重新赋值而改变
size = 22;
printf("%d",size);// 22
举例:
#define SIZE 4;// 符号常量
写法1,符号常量:int arr[SIZE];
写法2,常量:int size = 4; int arr[size]; // 重新给size赋值,并不会影响到数组的大小
写法3,常量:int arr[4]; int lcd[800*480];
类型:
代表了数组中元素的类型
容量:
数组中能存储多个元素,数组容量可以是一个常量、常量表达式、还可以是符号常量,但必须是整型。
深入理解:
①定义一个数组,相当于申请了一个可以容纳所指定元素数量的内存单元。所申请的内存单元是连续的。
②定义一个数组,相当于定义了多个匿名的变量,这写变量可以通过数组名下标来访问
范例:
// 定义一个数组
int arr[10];// 此时只是在内存中申请了10个元素所对应的空间,此时里面的值是随机值,大概率是0
// 上面数组中,最小下标是0,最大下标是9
数组元素的访问
原则:数组中的元素不能一次性访问所有,只能一个一个的访问。
访问方式:
数组的初始化
定义数组时,用指定数据来给对应的元素赋值
简化数组定义后,需要对元素一一进行赋值
语法规则:
数组名[下标];
举例:
// 定义一个容纳10个元素的int数组
int arr[10];
// 给数组的第一个元素进行赋值(存数据)
arr[0] = 89;
// 访问数组中的第一个元素(取数据)
int a = arr[0];
int c = arr[9]; // 0
int b = arr[10];// error,报下标越界异常,所以使用数组的过程中,一定要进行下标越界校验,否则报错
注意:数组元素的访问一定不能越界
-
数组部分可以初始化,也就是可以给数组前几个元素初始化,未被初始化的元素大概率是0;如果定义数组时未指定数据容量,则系统会根据初始化元素的个数来决定数组的容量。
-
柔性数组:
标准理解:柔性数组的概念:是在C99标准,针对结构体的最后一个成员可以指定大小的数组:(暂时了解)
广义理解:数组
数组的经典应用:冒泡排序
向后冒泡
- 一次只排好一个数,针对n个数,最差情况需要n-1次就可以排好
- 每次排序将相邻数据两两比较,将较大或者较小的数据向后交换,等所有数据比较完成,较大或者较小的数就会出现在最后,这也就是该数应该有的位置。
向前冒泡
-
元素数量-1=需要排的轮数
-
- 比较次数:
- 第一轮比4次()
- 比较次数:
选择排序、插入排序、快速排序、桶排序、堆排序、希尔排序、鸡尾酒排序、冒泡排序、二分查找、归并排序。
二维数组
定义
二维数组shian本质是一个行列式的组合,也就是说二维数组由行和列两部分组成,属于多维数组。
二维数组可以看作特殊的一维数组。相当于二维数组又是一个一维数组,只不过他的元素是一维数组()
语法:
数据类型 数组名 [行数][列数]; //二维数组外层表示行数,内存表示列数
举例:
int arr[3][3] = {{11,22,33},{12,13,14},{23,24,25}};//等价于下面写法
int arr[][3] = {{11,22,33},{12,13,14},{23,24,25}};int arr[3][3] = {{11,33},{12,14},{23,24,}};
注意:在C语言中,二维数组在计算机中的存储数据是按照行进行得到,即第一维的下标变化慢,即二维的下标变化快。
应用场合
主要运用于数据有行列要求的情况。比如说
特殊写法
- 下标可以是整型表达式,如:
a[2-1][2*2-1]
- 下标可以是已经有值的变量或数组成元素,
a[2*x-1][[3][1]]
- 数组元素可以出现表达式中,如:
b[1][2]=a[2][3]/2
- 使用数组元素的下标应在已定义数组的范围内;应注意区别定义数字组的大小和引用元素的数组的区别
初始化
- 分行给二维数组赋初值
int arr[3][4] = {{11,12,13,14},{21,22,23,24},{31,32,33,34}};
- 可将所有数据写在一个花括号内,按照排列顺序对元素赋值
int arr[3][4] = {11,12,13,14,21,22,23,24,31,32,33,34};
- 可对部分元素赋初值,其余未赋值部分自动填充 整型默认值-0 | 字符型默认值-\0 | 浮点型默认 值-0.0…
int arr[3][4] = {{11},{21,22},{31}};
- 若对全部元素赋初值,自定义数组时可以省略第1维数组的长度,第2维数组的长度必须指明。
int a[][4] = {11,12,13,14,21,22,23,24,31,32,33,34};
- 在分行赋初值时,也可以省略第1维的长度。
int arr[][4] = {{11,12,13},{0},{0,10}};