循环辅助语句
写循环的时候,有时候不想让它老老实实跑完所有轮次,就需要这几个语句来控制流程:
break —— 直接跳出当前整个循环。多层嵌套的话,只跳出它所在的那一层。
continue —— 跳过本次循环剩下的部分,直接进入下一轮。遇到continue之后,循环体里它后面的代码就不执行了。
return —— 跳出当前函数。如果return写在main函数里,整个程序直接结束。
这三个用得挺多的,尤其是break和continue,配合条件判断能省不少事。
数组
数组就是用来存一堆相同类型数据的东西,比如存10个学生的成绩,总不能定义10个变量吧。
数组的定义和访问
定义格式: 类型 数组名[元素个数];
比如 int a[10]; 就是定义了一个能存10个int的数组,占40个字节。
访问元素用下标: 数组名[下标] ,下标从0开始,到元素个数减1结束。一定要注意数组越界的问题,访问超出范围的下标是很危险的,可能会把别的数据搞坏。
初始化
数组不初始化的话,里面存的是随机值。常见的初始化方式:
- 全部初始化: int a[5] = {1, 2, 3, 4, 5};
- 局部初始化: int a[10] = {1, 2, 3}; —— 前面三个有值,后面自动补0
- 全0初始化: int a[10] = {0}; —— 所有元素都是0
- 省略个数: int a[] = {1, 2, 3}; —— 编译器自动根据初始化值确定个数
存储特点
数组在内存里是连续存放的,每个元素类型一致,按下标顺序排列。这三个特性(单一性、有序性、连续性)很重要,后面学指针的时候会经常用到。
数组排序
排序是数组最常见的操作了,这里记几个基础的排序算法。
选择排序
思路:每一轮从待排位置往后找,把最小的(升序的话)换到当前位置。
时间复杂度O(n²),空间复杂度O(1),不稳定排序。
冒泡排序
思路:相邻两个数两两比较,大的往后挪,每一趟确定一个最大值。
时间复杂度O(n²),空间复杂度O(1),稳定排序。
插入排序
把数组分成已排序和未排序两部分,每次从未排序部分取一个数,插到已排序部分的合适位置。这个思路比较直观,就像打扑克理牌一样。
二分查找
这个不是排序算法,但是和有序数组配合使用效率很高。前提是数组必须已经排好序了。
思路:每次和中间位置的数比较,大了就去右半边找,小了就去左半边找,每次砍掉一半。
时间复杂度O(logn),比遍历查找快得多,数据量大的时候优势特别明显。
字符数组
字符数组就是存字符的数组,本质上和普通数组一样,但因为经常用来存字符串,所以单独拿出来说。
初始化
用字符串字面量初始化的时候,末尾会自动加一个'\0'作为结束标志。这就是为什么"hello"看起来5个字符,实际占6个字节。
输入输出
输出可以用 printf("%s", str) 或者 puts(str) ,puts会自动换行。
输入的话, scanf("%s", str) 遇到空格、tab、回车就停止读了。 gets() 能读整行但是不安全,容易越界,实际开发中尽量少用。
常用字符串函数
C标准库提供了几个操作字符串的函数,挺实用的:
- strlen:计算字符串长度,不包括'\0'
- strcpy:把一个字符串拷贝到另一个字符数组
- strcat:把一个字符串拼接到另一个字符串后面
- strcmp:比较两个字符串的大小
这些函数都需要包含 <string.h> 头文件。
数组这块内容还是挺多的,排序算法建议自己手写几遍,光看是记不住的。下次再接着记函数的部分。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/2401_88406318/article/details/163313708



