数组
例子
如果我们要在程序中表示一个学生的成绩,我们会使用一个int来表示,假如我们要在程序中表示一组成绩,此时我们所学的常规的数据类型就无法再表示,这时就需要使用一种新的表现形式,这种表现形式就是数组
什么是数组
数组是相同类型,有序数据的集合
数组的特征
- 数组中的数据被称为数组的元素,是同构的
- 数组中的元素存放在内存空间里
衍生概念:下标(索引)
- 下标或索引代表了数组中元素距离第一个元素的偏移位置
- 数组中的元素地址值,下标越大,地址值越大(每一块内存空间都有一个独有的内存地址,变量空间以字节为单位进行地址的标注,我们也可以说一个内存单元就等于一个字节)
- 数组的下标是从0开始的
一维数组
数组的定义
语法:
类型说明符 数组名[数组容量]
#include <stdio.h>
int main()
{
int arr[20];
}
说明:
-
数组的类型说明符由数组中的元素来决定,也就是元素是什么类型,数组就是什么类型
-
数组名也是标识符,我们所说的数组(数组名),可以理解为数据类型是数组的变量(变量名),命名规则与变量名相同,遵循标识符命名规则
-
数组容量也可以叫做元素个数或者常量表达式,表达式必须为整型,可以包含常量和符号常量,但不能是变量
int arr[5]; //常量 #define COUNT 5 int arr[COUNT];//符号常量 int arr[800*480]; //常量表达式
类型:代表了数组中元素的类型
容量:数组中能存储多少个元素,数组容量可以是常量、常量表达式、符号常量,但必须是整数
深入了解:
- 定义一个数组,相当于申请了一个可以容纳所指定元素的内存空间。所申请的内存单元是连续的
- 定义一个数组,相当于定义了多个匿名的变量,这些变量可以通过
数组名[下标]
来标识
int arr[10];//最小索引:0;最大索引:9
分析得到
数组的最大下标 = 数组的元素个数(数组容量) - 1
数组元素的访问
原则:数组中的元素不能一次性访问所有元素,只能一个一个的访问
访问方式:
数组名[下标]
说明:以上语法,既能实现数组中元素的取,也能够实现数组中元素的存
//定义一个能够容纳10个元素的int数组
int arr[10];
//给数组的第一个元素进行赋值
arr[0] = 89;
//访问数组的第一个元素
int a = arr[0];
int b = arr[10]; //error:下标越界异常
注:数组元素的访问不能越界
数组的初始化
定义数组的同时,用指定数据来给对应元素赋值
简化数组定义后,需要对元素一一赋值操作
类型 数组名[容量大小] = {常量1,常量2,...};
注意:
-
数组可以部分初始化:也就是可以给数组中的前几个元素初始化,未被初始化的元素系统将自动初始化,如果定义数组时未被指定数据容量,则系统会根据初始化元素的个数来决定数组容量。
// 1.如果定义数组时只给数组前几个元素初始化,后续剩余元素会自动完成初始化 int arr[10] = {11,12,13,14,15}; //推荐写法,未被初始化的元素补0 int arr[10] = {11,12,13,14,15,0,0,0,0,0} // 2.如果定义数组时未指定数组容量,根据初始化元素的个数来决定容量 int arr[] = {1,2,3,4,5}; //推荐写法,等价于以下写法 int arr[5] = {1,2,3,4,5};
衍生概念:
- 柔性数组:在C99标准,针对结构体的最后一个成员可以是一个未指定大小的数组;
例子:
在不知道数组类型的情况下,如何确定数组元素的个数
int length = sizeof(arr) / sizeof(arr[0]);
说明:
①
arr
就是计算的数组本身,sizeof(arr)
用来计算该数组中总字节大小②
sizeof(arr[0])
用来计算数组中第一个元素所占的字节大小,因为数组中元素类型相同,所以计算哪一个都行③
sizeof(arr) / sizeof(arr[0])
就是用数组中总的字节数除以每一个元素所占的字节数,从而得到元素的个数(容量)
冒泡排序
思想:
- 一次只排好一个数,针对n个数,最差情况需要n-1次就可以排好
- 每次排序将相邻数据两两比较,将较大或较小的数据向后交换,等所有数据都比较完成,将较大/较小的数就会出现在最后,是该数应在的位置
- 在剩下的数中,再次应用第二步操作,直到剩下一个数
二维数组
定义
二维数组本质上是一个行列式的组合,也就是说二维数组是由行和列两部分组成的。二维数组是通过行列进行解读的。
二维数组可被视为一个特殊的一维数组,相当于二维数组又是一个一维数组,只不过它的元素是一个一维数组(也就是数组的元素可以是数组类型)
语法
类型 数组名[行数][列数];
举例:
int arr1[3][3] = {{11,12,13},{21,22,23},{31,32,33}};//等价于
int arr1[][3] = {{11,12,13},{21,22,23},{31,32,33}};//柔性数组
int arr2[3][] = {{11,12},{21,22,23},{31}};//错误!!!
int arr2[3][] = {{11,12,0},{21,22,23},{31,0,0}}//错误!!!
int arr3[][] = {{1,2,3},{4,5,6},{7,8,9}} //错误!!!
注意:在C语言中,二维数组在计算机的存储顺序是按行进行的,即第一维的下标变化慢,第二维的下标变化快。
应用场合
主要应用于数据有行列要求的情况。比如说现在要存储学生的成绩。
特殊写法
- 下标可以是整型表达式,如
a[2-1][2*2-1]
- 下标可以是已经有值的变量或数组元素,如
a[2*x-1][b[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}};
- 若对全部元素赋初值,自定义数组时可以省略第一维数组的长度,第二维数组的长度必须指明
int a[][4] = {11,12,13,14,21,22,23,24,31,32,33,34};
- 在分行赋初值时,也可以省略第一维的长度
int arr[][4] = {{11,12,13},{0},{0,10}};
标签:11,arr,下标,数组,int,元素,C语言,一维
From: https://blog.csdn.net/Are_pro_bald/article/details/144367623