数组是存储于一个连续空间且具有相同数据类型的元素集合。C语言针对数组提供形式:一维数组,二维数组,多维数组,此篇文章先讨论一维数组。
一:一维数组:
1.定义的语法:类型说明符 数组名[常量表达式]
(1)类型说明符:用来说明要处理的数据的类型
(2)数组名:名字 --- 代表这个数组
(3)[常量表达式]: 整型常量表达式,表示的是,该数组中有多少个同类型的变量
eg:int score[10]:表示定义了一个数组,这个数组中有10个元素,每个元素类型是int型
2.初始化方式
方式1 -- 初始化列表:int score[10] = {1,2,3,4,5,6,7,8,9,10}; 初始化列表 --全部初始化
方式2 -- 部分初始化:int score[10] = {1,2,3,4,5}; 部分初始化,已初始化部分,挨个给值,未初始化的部分,默认给成0
全部初始化成 0 : int a[10] = {0};int a[10] = {};{} --- 初始化器
未初始化的数组:随机值(垃圾值)
数组长度可以省略,但是前提是,必须要有初始化的值,如:int a[]; 此时是错误的 --- 编译器也不知道有多大;int a[] = {1,2,3,4,5}; 编译器会根据给到的元素值的个数来推算出元素的个数(数组长度)
3.一维数组元素引用:需要说明引用的是哪个元素
语法:数组名[下标];下标 就是对应元素在数组中的编号,并且下标从0开始
4.数组越界:
(1) 编译器并不检查这种问题,作为程序员 自己小心
(2)数组下标的合法范围:[0~len-1]
5.数组名:
(1)数据类型:数组名 --可以代表数组这种数据类型,sizeof(arr) --- 整个数组的大小
(2)代表值:代表的是数组对应空间的起始地址,数组名所代表的地址为数组首元素对应的地址
(3)数组下标:本质上是相对于首元素的偏移量(偏移了几个元素)
6.数组特点:连续性(一片连续的内存空间),有序性,单一性(同种类型 内存空间大小都相同)
补充:1)c99标准开始,数组长度可以是一个整型变量: int a[n];不能初始化
2)数组不能整体操作,只能操作具体的元素
7.关于排序:这里说一下选择排序与冒泡排序的思想,具体实现方式在此篇文章:C语言关于排序的实现-优快云博客。
(1)找最大值
(2)逆序
(3)选择排序思想:给合适位置,选择合适的数
(4)冒泡排序:思想相邻两个元素两两比较 ,小的放前,大的放后
(5)二分查找:每次找到中间的一个值(二分法)进行判断
二:二维数组:C语言中,并不存在真正的二维数组;数组是一种数据类型,二维数组可理解为一维数组的一维数组。
1.二维数组的定义:数据类型 数组名[整型常量表达式][整型常量表达式];int a[5][6];
2.二维数组的初始化:
(1)全部初始化:int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
(2)按行初始化:int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
3.二维数组元素的引用:数组名[行下标][列下标];
4.二维数组的特点:满足数组特点:单一性,有序性,连续性
5.二维数组的理解:
(1)c语言中,并不存在真正的二维数组
(2)一维数组的一维数组
(3)二维数组在内存上,数据的存放和一维数组没什么区别
(4)二维数组是按行优先存储
三:字符型数组:
1.字符型一维数组:char ch[10] = {'h','e','l','l','o','w','o','r','l','d'};
2.字符串:多个字符数据 --- 字符串( 一串字符 ---更在乎整体一个意思 )用来表示 一串字符,char ch[10] = "hello";
(1)字符串在c语言中,都是按字符型一维数组来处理的
(2)在字符串末尾会默认添加一个结束标志 '\0'
3.字符数组 与 字符串
(1)字符数组 可以 用来 存放字符串数据
(2)字符串关心是字符串这个整体, 此时结束标志('\0')重要,而数组长度不那么重要了,编写代码时,数组长度可能不再需要,而是以结束标志作为判断依据
4.输出字符串的方式:
(1)puts():int puts(const char *s);
功能:输出字符串
参数:@s 表示存在字符串的空间的首地址
返回值:成功输出非负数,失败输出EOF
puts内部实现(默认自带\n)
int i = 0;
while (ch2[i] != '\0')
{
printf("%c",ch2[i]);
++i;
}
putchar('\n');
(2)char *gets(char *s);(建议使用fgets替换gets,gets比较危险)
功能:输入字符串
参数:@s 表示存放字符串的一块空间的首地址
返回值:成功返回就是s
gets内部实现:
方式1
do
{
str[i] = getchar();
}while (str[i++] != '\n');
str[i-1] = '\0';
方式2
while ( (str[i] = getchar()) != '\n')
++i;
str[i] = '\0';
4.字符串的输入:gets (),scanf() (如果输入的字符串中间有空格,只能接收空格前面的数据)
注意:空间尽可能足够,否则可能导致越界
5.字符串函数:
这些字符串函数的实现在此篇中:关于字符串函数的实现方式-优快云博客
(1)字符串的长度:指的是 '\0'前面字符的个数
(2)字符串长度计算:strlen();
size_t strlen(const char *s);
功能:计算字符串长度
参数:s --- 存在字符串的一块内存空间的首地址
返回值:成功返回长度,size_t --- long int
(3)字符串拷贝:strcpy
char * strcpy(char *dest, const char *src;
功能:将src中的字符串 拷贝到 dest
参数:src 存放这源字符串的 一块空间的首地址,dest 存放字符串的目的空间的地址
返回值:成功返回dest空间的地址,失败返回NULL
(4)字符串拼接:strcat
char *strcat(char *dest, const char *src);
功能:拼接字符串
参数:dest拼接的目的字符串对应空间的首地址,src 源字符串对应空间的首地址
返回值:成功返回dest空间的地址,失败返回NULL