数组的基本概念:
什么是数组:数组是相同类型、有序数据的集合,用统一的数组名来表示,数组中的每一个分量-----元素下标来区分
数组的特征:
①数组中的数据被称为数组的--元素,是同构的
②数组中的元素存放在内存空间里,eg:char king[6] 申请在内存中开辟6块连续的基于char类型的变量空间
衍生概念:下标(索引)
①下标(索引)代表了数组中元素距离第一个元素的偏移位置
②数组中元素的地址值,下标越大,地址值越大。(每一块内存空间都有一个独有的内存地址)
③数组的下标是从0开始的
一维数组:
数组的定义:
语法:类型说明符 数组名[常量表达式];
说明:①数组的类型说明符由数组中的元素决定(元素啥类型,数组就是啥类型)
②数组名也是标识符,我们所说的数组[名],可以理解为数据类型是数组的变量[名]
③数组容量也可以叫做常量表达式,eg:int ages[10]、int lcd[1024*768]
类型:代表了数组中元素的类型
容量:数组中能存储多少个元素,数组容量可以是一个常量、常量表达式、还可以是符号常量,但必须是整型
深入理解:①定义一个数组,相当于申请了一个所指定的元素数量的内存单元,所申请的内存单元是连续的
②定义一个数组,相当于定义多个匿名变量,这些变量以通用过 数组名[下标] 来标识
数组元素的访问:
原则:数组中的元素不能一次性的访问所有元素,只能一个一个访问
访问方式:数组名[下标名]
注意:数组元素的访问一定不能越界
案例:
数组的初始化 :
定义数组的同时,用指定数据来给对应元素赋值
简化数组定义后,需要对元素一一赋值操作
语法规则:类型 数组名[容量] = {常量1、常量2、常量3.....};
注意:·数组可以部分初始化,也就是可以给数组中前几个元素初始化,未被初始化的元素系统将自动初始化,如0,如果定义数组时,为指定数据容量,则系统会根据初始化元素的个数来决定数组容量
衍生概念:·柔性数组:柔性数组的概念实在C99标准,针对结构体的最后一个成员可以一个未指定大小的数组
· 广义简单理解:数组容量待定或者待确定的数组,eg:int arr[] = {1,2,3,4,5}
面试题:
·在不知道数组类型的情况下,如何数组元素的个数
int length = sizeof(arr)/sizeof(arr[0]);
说明:①arr就是我们计算数组本身,sizeof(arr)用来计算该数组中的总字节大小
②sizeof(arr[0])用来计算数组中一个元素所占字节的大小,因为数组中的元素类型相同,所以计算哪一个都行
③sizeof(arr)/sizeof(arr[0])就是用数组中的总字节数除以每一个元素所占的字节数,从而得到元素的个数
案例:一维数组
典型应用:数据排序
冒泡排序:·向后冒泡
思想:①一次只排好一个数,针对n个数,最差情况需要n-1次就可以排好
②每次排序将相邻数据两两比较,将较大或较小的数据向后交换,等所有数据都比较完成,将较大或较小的数就会出现在最后,这也是该数应该有的位置
③在余下的数中,再次应用第二步,知道只剩下一个数
·向前冒泡
思想:①一次排好一个数,针对n个数,最差情况需要n-1次就可以排好
②每次排序假定第一个元素最大或最小,用第一个元素后面的元素一一与第一个元素比较,遇到较大或较小的和第一个元素交换,访问完数组的最后一个元素,就排好了一个数
③在余下的数中,再次应用第二步,知道只剩下一个数
二维数组:
定义:①二维数组本质上是一个行列式的组合,也就是说二维数组是由行和列两部分构成,二维数组数据是通过行列解读。
②二维数组可以被视为一个特殊的一维数组,相当于二维数组又是一个一维数组,只不过他的元素是一维数组
语法:类型 数组名[行数][列数];
举例:int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}} 等价于 int arr[][] = {{1,2,3},{4,5,6},{7,8,9}};
应用场合:主要应用于数据有行列要求的情况
特殊写法:(建议进做题时)
初始化:
·分行给二维数组赋初始值
·可将所有数据写在一个花括号内,按照排列顺序对元素赋值
·可对部分元素赋初始值,其余未赋值部分自动填充(0、\0、0.0........)
·若对全部元素赋初始值,自定义数组时可以省略第一维数组的长度说明,第二维度的数组长度必须指明
·在分行赋初始值时,也可以省略第一维度的长度
案例:二维数组的遍历
字符数组:
概念:元素类型为char字符型的数组,字符数组往往是用来存储字符串数据的,需要注意的是,我们C语言中的字符是字节字符
字节字符:也就是一个字符占一个字节
Eg:
语法:
注意:我们的char数组初始化的时候,没有完全赋完值的时候,空出来的地方用\0补充
案例一:
字符串和字符数组结束的标志:
说明:
字符串数组的多样表示如下:
注意:·字符串的长度与字符数组的长度不一定相同
·利用字符串常量,可以对字符数组进行初始化,但不能用字符串常量为字符数组赋值,eg:如下
字符串的基础操作:
字符串的输入:
①语法:scanf(“%s”,数组名);
案例:
采用scanf进行字符串的输入,要求字符串中不能存在空格,
②语法:fgets[数组名,数组容量,stdin];
说明:采用fgets进行字符串输入,可以获取所以输入的字符串,包含\n,在实际的字符串处理时,我们可能需要处理\n
案例:
注意:·如果输入的字符串不包括空格和换行,可以使用是scanf()和fgets()
·如果属于入的字符串包含空格和换行,只能使用fgets()
字符串的输出:
puts(数组名)
案例:
字符串的拼接:
strcat(数组名,”需要拼接的字符串”)
注意:需要引入#include <string.h>
案例:
字符串拷贝:
strcpy(数组名,字符串)
注意:需要引入<string.h>库
说明:这个方法适合给字符串赋值用
案例:
字符串的比较:
strcmp(字符串1,字符串2);
注意:·需要引入<string.h>库
·返回结果是布尔类型
案例:
获取字符串的长度:
strlen(字符串)
注意:·需要引入<string.h>库
·返回的是字符串的长度