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