1 数据的存储
1.1 整形的存储
1.1.1 原、反、补码
原码:将整数按照正负数的形式翻译成二进制,最高位表示符号位,0为正,1为负
反码:正数=原码,负数=原码除符号位按位取反
补码:正数=原码,负数=反码+1
数据存放内存中存放的是补码
1.1.2 大小端存储
大端存储模式:数据的低位保存在内存的高地址中,数据的高位保存在内存的低地址中
小端存储模式:数据的低位保存在内存的低地址中,数据的高位保存在内存的高地址中
1.1.3 赋值的截断和提升问题
1.1.4 常量
(1)字面常量
(2)const修饰的常变量
(3)#define定义的标识符常量
(4)枚举常量
1.2 浮点数的存储
2 数组和指针
2.1 数组和指针
2.1.1 数组
2.1.2 指针
2.1.3 联系和区别
2.2 指针数组
2.3 数组指针
2.4 数组名的意义
2.5 二维数组和二级指针
2.6 函数指针
2.7 笔试题
3 常见的库函数
3.1 字符串函数
3.1.1 strlen
计算字符串的长度
strlen遇上转义字符
strlen和sizeof的区别
3.1.2 strcpy
3.1.3 strcat
3.1.4 strstr
3.2 内存函数
3.2.1 memcpy
3.2.2 memmove
3.2.3 memcpy
3.2.4 memset
3.3 整形和字符串转换函数
3.3.1 atoi
3.3.2 itoa
3.4 笔试题
库函数的使用和模拟实现
4 自定义类型详解
4.1 结构体
结构体的内存对齐规则(空间换时间)
- 第一个成员在与结构体变量偏移量为0的地址处。
- 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的值为8 - 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
- 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍
// 12
struct S1
{
// 偏移量从0开始
char c1;//0偏移量
//下一个是1偏移量 不是4的倍数
// 浪费3个字节
int i;//4-7
//8
char c2;//8
// 12
};
// 8
struct S2
{
char c1;//0
//1
char c2;//1
//2
int i;//4-7
// 8
};
// 6
#pragma pack(1)
struct S3
{
char c1;//0
//1
char c2;//1
//2
int i;//2-5
// 6
};
#pragma pack()
设置默认对齐数
#pragma pack(n) //设置默认对齐数为n
#pragma pack() //还原为默认
4.2 枚举
优缺点
4.3 联合
大小计算
5 内存管理
5.1 malloc、calloc、realloc的区别
5.2 结合操作的进程地址空间,考察程序中变量的存储区域
6 文件操作
6.1 文件读写常见的系统接口及使用
6.2 二进制文件和文本文件
定义
区别
7 程序的编译和链接
7.1 C/C++的编译链接的过程
(1)预处理:宏替换;条件编译;去掉注释;展开头文件
(2)编译:检查语法生成汇编代码
(3)汇编:将汇编代码翻译成机器码,生成目标文件
(4)链接:将目标文件链接到一起,生成可执行程序
7.2 头文件ifndef/define/endif的作用
7.3 #include<filename.h>和#include"filename.h"的区别
7.4 宏的优缺点
C++用什么技术替代宏
8 关键字
8.1 volatile
8.2 extern
8.3 static
修饰变量和函数
(1)修饰局部变量,改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束时生命周期才结束
(2)修饰全局变量,使得这个全局变量只能在本源文件内使用
(3)修饰函数,使得这个函数只能在本源文件使用
8.4 const
8.5 typedef
类型定义,可以理解为类型重命名
// 把int重命名为myint
typedef int myint;
8.6 sizeof
以字节形式给出了操作数的存储大小,操作数可以是类型、指针、数组、函数