1. 基础知识
1.1 计算机的数据表示
1.1.1 数值型数据
进制,二进制、八进制、十进制、十六进制
进制之间转换
1.1.2 非数值型数据
man ASCII
\0 \n ' ' 0~9 a~z A~Z
1.2 词法符号
1.2.1 关键字
32个关键字
- 存储类型:auto、static、extern、register
面试题:static的特点
限制作用域、延长生命周期、存放位置、初值
面试题:如何引用一个其他文件中的全局变量
- 数据类型:int、char、short、float、double、signed、unsigned
笔试题:计算类型的取值范围
char :有符号字符型 -128 ~ 127 -2^7 ~ 2^7-1
unsigned char:无符号字符型 0~255
int:-2^31 ~ 2^31-1
- 构造数据类型:struct、union、enum
- 控制语句:if、else、for、while、do、break、continue、return
- 其他:sizeof(计算数据在内存中所占的空间大小)、const(常量化)、volatile(防止编译器优化)
typedef(重定义)、void
面试题:sizeof和strlen的区别?
面试题:const的特点?
面试题:typedef和define区别?
typedef int * INT;
#define INT_T int *;
INT a, b;
INT_T c,d; //int *c, d;
1.2.2 标识符
对变量名、函数名等起名时遵循的命名规则
1)不能和关键字重复
2)由字母、数字、下划线组成
3)开头不能是数字
1.2.3 运算符
- 算术运算符:+、-、*、/、%、++、--
/:向下取整, int a = 5/2; //a=2 float t=5/2; //t=2.0 float t=5/2.0; //t=2.5
%:操作数只能是整数
++:
a++:先取值后自加
++a:先自加后取值
- 关系运算符:>、>=、<、<=、==、!=
- 逻辑运算符:&&、||、!
截断法则:
表达式1 && 表达式2:表达式1为假,表达式2不会进行运算
表达式1 || 表达式2:表达式1为真,表达式2不会进行运算
- 位运算符:&、|、^、~、<<、>>
笔试题:将一个数的某一位置1或清零,写出表达式.
- 赋值运算符:+=、-=、*=、=
- 三目运算符:
格式:表达式1?表达式2:表达式3
- 逗号运算符:以最后一个表达式的运行结果作为最终结果
(表达式1,表达式2,表达式3)
1.2.4 分隔符
空格、tab、回车
1.2.5 标点符号
逗号、分号、()、{}、[]
1.3 变量和常量
1.3.1 变量
面试题:全局变量和局部变量的区别
存放位置、生命周期、作用域、初值、定义位置
1.3.2 常量
- 字符常量:用单引号引起了的一个字符
- 整型常量:整数
- 字符串常量:用双引号引起来的一串字符
- 浮点常量
- 指数常量
- 标识常量:宏定义
#define 宏名 表达式
特性:原样替换
笔试题:用宏定义表示出两个数中的最小值
#define MIN(a,b) (a>b?b:a)
1.4 输入输出语句
- 格式输入输出:scanf/printf
- 字符输入输出:getchar/putchar
- 字符串输入输出:gets/puts
2. 控制语句
2.1. 分支语句
2.1.1. if/else语句
格式:基本格式、嵌套格式、多层格式
注意:if后面可以没有else,else前面必须得有if
if和else中间不能有间隔语句
2.1.2. switch/case语句
格式:
注意:switch后的表达式不能是字符串或浮点类型
case后可以不写break
2.2. 循环语句
2.2.1. for循环
格式:
注意:for(;;);死循环
笔试题:打印水仙花数
笔试题:打印99乘法表
笔试题:打印图案
*
**
***
****
*****
2.2.2. while循环
格式:while(表达式){循环体}
注意:表达式是循环的终止条件,循环前需要增加赋初值的表达式,循环体内需要增加自增或自减的表达式
while(1){循环体}
先判断条件,再执行循环体
2.2.3. do/while循环
格式:do{循环体}while(表达式);
注意:先执行循环体,再判断条件
2.3. 循环控制语句
2.3.1. break
结束循环
2.3.2. continue
结束本次循环,继续下一次循环
注意:用于循环语句,但是break也可以switch/case语句使用
一定要用前提条件,需要有if语句
3. 数组
概念:具有一定顺序关系的若干数据的集合
特点:数据类型相同
内存连续
3.1. 一维数组
- 格式:数据类型 数组名[元素个数];
- 特点:数组名代表数组的首地址,是地址常量
- 大小:数据类型大小*元素个数
- 注意:定义数组时元素个数可以省略
3.2. 二维数组
- 格式:数据类型 数组名[行数][列数];
- 特点:数组名代表第一行的首地址
数组名前加*,将行地址降级为列地址
- 大小:数据类型大小*元素个数(行*列)
- 注意:行数可以省略,列数不能省略
3.3. 字符数组
- 初始化
char 数组名[元素个数] = “字符串”
= {'a','b'.....};
= {"字符串"}
scanf("%s", 数组名);
- 遍历
printf("%s\n", 数组名);
3.4. 排序算法
3.4.1. 冒泡排序
思想:两两比较,满足条件进行交换,一趟比较完成后,最大值就放在了最后
3.4.2. 选择排序
思想:从数列中找最小值,找到后和第一个位置的数据进行交互,再从剩下数中找最小值,依次类推
3.5. 数组清零函数
3.5.1. bzero
3.5.2. memset
笔试题:冒泡排序
笔试题:打印斐波那契数列前15个数
笔试题:打印杨辉三角前10行
4. 指针
4.1. 一级指针
- 格式:数据类型 *指针名;
- 运算:
算术运算:+、-、++、--
两个指针相减代表的是相隔数据元素的个数
关系运算:> >= < <= == !=
赋值运算:
赋变量的地址
数组地址
指针
- 符号:
*
&
4.2. 二级指针
- 格式:数据类型 ** 指针名;
- 定义:存放一级指针的地址的变量
笔试题:主要是二级指针访问数据,函数传参
4.3. void和const
4.3.1. void
void *p; 任意类型的指针
强制类型转换
4.3.2. const
const int *p; //int const *p;
int *const p;
const int *const p;
面试题:说一说对指针的理解?
面试题:指针和数组的区别?
4.4. 指针数组
- 概念:本质是数组,数组中存放的是指针
- 格式:数据类型 *数组名[元素个数] = {};
- 大小:元素个数*指针的大小
4.5. 数组指针
- 概念:本质是指针,指向数组的指针
- 格式:数据类型 (*指针名)[个数];
- 大小:指针的大小
面试题:指针数组和数组指针的区别
5. 函数
5.1. 函数基础
- 概念
- 函数传参:
值传递:单向,实参值传递给形参,形参变化不会影响实参
地址传递:传递的是地址,形参变化会影响实参的值
数组传递:传递的是地址
数据类型 函数名(数据类型 数组名[(元素个数)]){}
int pipe(int fd[2]);
笔试题:实现两个数据交互的代码,分析打印结果
笔试题:void fun(int a[100]){ sizeof(a)}
5.2. string函数族
strlen、strcpy、strcat、strcmp、strncmp、strncpy
笔试题:写出strlen、strcpy、strcat源码实现
5.3. 指针函数
概念:本质是函数,返回值是指针
5.4. malloc和free
malloc:手动开辟堆区空间
free:手动释放堆区空间
char *getmem(char *p)
{
p = malloc(100);
strcpy(p, "hello");
return p;
}
main()
{
char *str = NULL;
getmem(str);
printf("%s\n", str);
free(str);
}
char *getmem(char **p)
{
*p = malloc(100);
strcpy(*p, "hello");
return *p;
}
main()
{
char *str = NULL;
getmem(&str);
printf("%s\n", str);
free(str);
}
面试题:说一说对函数的理解
6. 结构体/共用体/枚举
6.1. 结构体
- 定义格式
- 结构体变量
- 结构体数组
- 结构体指针
- 结构体大小
面试题:结构体的字节对齐原则?
6.2. 共用体
- 特点:
所有成员共用一块地址空间
后面的赋值会覆盖前面的赋值
- 大小:成员中类型最大的
面试题:什么是大小端?
面试题:如何验证大小端?
面试题:结构体和共用体的区别
6.3. 枚举
enum {}
面试题:枚举和define区别
7. 内存分配
7.1. 全局区/静态区
全局变量或静态变量
.bss:未初始化的全局变量或静态变量
.data:已初始化的全局变量或静态变量
7.2. 栈区
系统自动开辟自动释放
局部变量、函数的形参、返回值
7.3. 堆区
手动开辟手动释放
malloc开辟的空间
7.4. 常量区
常量
char *p = "hello";
*p = 'w'; //不能
char *q = "hello";
面试题:栈区和堆区的区别
面试题:什么内存泄漏?
面试题:什么是野指针?
面试题:产生段错误的原因?怎么解决段错误?