标准输入输出
格式化输入输出
字符数据的输入输出
预处理命令
变量:
变量的存在性(可见性)
变量的生存周期
数组名&指针:
我们都知道一维数组的时候,数组名字指代数组第一个元素的地址,类似于一个指针。
比如,定义int a[10]; 我们就知道 a==&a[0]; *(a+i)==a[i]; a类似于一个指向int的指针变量,a+1在地址上实际是a+1*sizeof(int)。
同理,定义完int a[10][10]; 我们就知道 a==&a[0]; a[0]==&a[0][0].
a[0]类似于一个指向int的指针变量,a[0]+1在地址上实际是a[0]+1*sizeof(int)。
a类似于一个指向"整个"int[10]的指针变量,a+1在地址上实际是a+1*10*sizeof(int)。
这里不容易理解的地方在于,a[i]在数学上是存在且有数字的,他的值就是:&a[i][0],同时也是:*(a+i);但是在物理上却是不存在的。
*(a+i)的实际意义,其实不是“指针变量a[i]”,而是以a[i]起头的一维数组“a[i][0]...a[i][9]”的首地址。
这是由“数组的定义”定义的,所以说a类似于一个指向指针的指针,但是实际上并不是,它是一个数组的一部分,就是数组的首地址。不要完全按照指针去理解。
当然,指向指针的指针也可以定义动态二维数组。
int** a;
a=new int*[n];
for(int i=;i<n;i++)
a[i]=new int[m];
这里的每个*(a+i)就是有物理存储的了。和静态数组的区别在于:
1,多了n个变量来存放二级指针。(缺点)
2,可以不连续存储。(优点)
分支结构:
?表达式(条件运算符)
if语句
switch语句
循环结构:
自增/自减运算符
while和do_while语句
break&continue语句
for语句
指针:
一个翻译C语言成人话的网站:https://cdecl.org/
看到一个巨无敌的读变量声明的方法叫做“右左震荡法”
(来源:http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html)
就是说:
0,见到如下符号就进行替换
- "[]" == "一个数组,他的每个元素是"
- "()" == "一个函数,它的返回值是"
- "*" == "一个指针,指向"
1,找到变量;
2,往右看,直到表达式结束或者遇到一个右括号。
3,往左看,直到表达式开头或者遇到一个左括号。
重复23,直到全部扫完。
举个例子:
动态申请回收资源:
指针函数:
自定义数据结构
struct结构体
结构体指针
union共同体/联合体
enum枚举类型
typedef声明新类型名
sizeof函数,返回变量或者数据类型的大小(字节为单位)
字节对齐(百度面试遇到的.....)
文件操作
文件顺序读写
以二进制方式读写文件
随机读写数据文件(常用于二进制文件的读写)