1.static/const
C语言的关键字
static 修饰 局部变量时 延长了局部变量的生命周期 直到程序结束 作用域取决于定义它的函数
static 修饰 全局变量时 只允许全局变量在定义它的源文件中使用 其他文件不能对其进行调用
static 修饰 函数是 也只允许函数在定义它的源文件中使用 其他文件不能对其进行调用
const 定义 常量 即不可修改的值
const 修饰指针时
常量指针 const int * /const * int ->常量的值不可以改变 指针的指向可以改变
指针常量 const * int ->指针的指向不可以改变 常量的值可以改变
2.#define/typedef
#define 处于 程序预处理阶段 不受作用域规则的限制 对文本进行替换
typedef 处于 程序编译阶段 受作用域规则的限制 创建一个新的数据类型
3.volatile
告诉编译器 被其修饰的变量的值可能会被程序以外的因素(如操作系统、硬件等)所改变 因此每次使用该变量时都需要从内存中重新读取 而不能使用保存在寄存器中的缓存值
4.sizeof/strlen
sizeof 用于计算变量或数据类型所占用内存的字节数(包含\0) 是操作符 在预处理阶段进行 不对括号内的值进行运算
strlen 用于计算字符串数组的长度(不包含\0) 是函数 在程序运行阶段进行 会对括号内的值进行运算
5.gcc 编译四个阶段
预处理 展开头文件 进行宏替换 删除注释
编译 有错报错 没错继续运行 生成不可执行二进制文件
汇编 生成可执行二进制
链接 链接库函数 动态库或者静态库
6.数组/链表
数组 存储:连续存储 占用固定的空间 资源利用率低 容易造成资源浪费 或 不足
访问:可以通过下标直接访问 时间复杂度为O(1)
插入/删除:需要移动大量数据 时间复杂度为O(n)
链表 存储:随机存储 按需分配 资源利用率高 但每个节点需要额外的存储空间
访问:每次访问需要从头节点开始遍历 时间复杂度为O(n)
插入/删除:可以从任意节点插入 只需修改相关指针 时间复杂度为O(1)
7.指针的理解
指针 内存地址
指针变量 存储内存地址的变量
-> 间接访问和操作所指向的内存空间的数据
->> 实现内存的动态分配
->> 实现复杂的数据结构
->> 作为函数参数进行高校的参数传递
使用时
-> 初始化 防止指向任意内存位置
-> 不使用时要进行内存释放
-> 注意指针的运算以及解引用
避免野指针
-> 初始化指针
-> 释放内存后置空
-> 注意防止下标越界