C语言总结的知识点
什么是有效数字? ------------------------- 数据类型 运算符: 函数: 程序结构: 存储结构 内存管理 关键字: ------------------------- C语言: 我认为编程就是对数据操作 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx数据类型xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 基本数据类型:原子数据类型是最小数据单元: 空类型:是所有数据类型的基础。 构造数据类型:在基本数据类型的基础上构造而成的复合数据类型。 ############################ 基本数据类型:也称为原子数据:最小数据单元 ############################ 整型变量 种类: short int ,int ,long int 长度: 32位机长度:2 4 4 注意; 在嵌入式系统中为了兼顾可移植性和效率: 将int的控制在unsigned int和 signed int的交集 整型常量: 开头: 以0和0x开头区分八进制和十六进制 结尾: 为了显示的表达整型数据的类型,在结尾添加L和U分别表示长整型和无符号整型 ##################### 浮点型变量 种类: float double long double 长度: 4 8 8 有效数字: 6 16 18 浮点型常量 表现形式: 点分十进制:默认double类型 指数形式: 尾数E指数 3E-3 ######################## 字符型变量: 种类: char 大小: 1 内容: 字符对应的ASSIC值 字符常量 形式: 用单引号括起一个字符 特殊: 特殊的字符串常量转移字符:\n \t \\ \' ########################### 指针型 指针常量: 数组名: int a[];a为地址常量; 字符串常量: char a[]=“asdf”;a为字符串常量; C语言中没有专门的字符串常量,利用字符串所在内存的首地址表示该字符串; 指针变量: 定义; 给每个内存单元对应一个编号,利用该编号可以快速方位该内存单元; 大小: 编号就是指针:四字节,内存单元:1字节 关于*: int *p; *是数据类型一部分 int *p,q; p是指针,q是整型变量 *p: 指针解引用符 关于二维: 二维指针: int **a; 保存变量类型一维指针的地址 二维数组指针: int (*a)[]; 保存变量类型二维数组名 二维指针数组: int *a[]; 是一个数组,元素类型为指针 野指针: 定义: 指针随机指向一块内存: 原因: 指针变量未初始化 指针已被释放 指针被手动free 指针访问越界 ######################## 枚举型 #################### 空数据类型: NULL:常量值为0 void * 定义: 数据类型不确定的指针变量 作用: 通过强转可以指向任意数据类型 使用: (void *)malloc(size):用于数据类型转换; fun(void *a):用于参数传递 #################### 构造数据类型 #################### 结构体和数组: 结构体和数组型变量作为形参: 分别是值传递和地址传递; #################### 数组: 定义: 具有一定关系的若干个变量集合 种类: 数值数组,字符数组,指针数组,结构体数组 格式: 数据类型 数组名 数组长度 数组名:地址常量 数组长度:常量 注意: 防止数组访问越界; 初始化: 不初始化: 局部数组不初始化,元素值不确定。 static数组不初始化,默认值零 全局变量不初始化,默认值零 初始化: 全部初始化:定义时初始化。int a[2]={1,2}; 部分初始化:初始值比数组长度小,自动赋零。int a[2]={1}; 赋值初始化:定义的时候无数组长度,int a[]={1,2}; 初始化零: 直接赋值为零;int a[2]={0}; 字符数组和字符串: char a[]="asdfg"; 数组长度:字符个数加一,默认添加\0 char *a="asdfg"; 字符指针a指向一个字符串常量; 字符串处理函数函数: 赋值:strcpy(), 比较:strcmp(), 求长:strlen(). ###################### 结构体: 特点: ①用户自行构造 ②由不同基本数据类型构成 ③定义时不分配空间,定义变量时才分配; 使用: 访问结构体变量的成员: 结构体变量名.成员名 结构体指针->成员名 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx运算符xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 原则:尽量使用括号,阅读更方便; 优先级:大略分:四大天王() [] -> . 单目 双目 例如:*p++和*++p; *p++;访问p指向的对象,p后移一位; *++p;访问p后移一位所指向的对象; 数据类型转换:对数据类型进行临时转变,并不改变本身类型; 自动:float-》double char short-》int 强制:(类型名)表达式 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx函数xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 编程的思想:高内聚,低耦合; 格式:返回值类型 函数名 参数 函数体 ============== 函数声明: extern修饰:表示该函数定义在其他源文件中 static修饰:表示该函数只能在本文件内使用 ============== 函数调用: ①函数语句 ②函数表达式 ③函数参数 ============== 返回值 ============= 函数名: 定义: 是函数指针,是一个函数的入口地址 作用: 用于回调函数(信号注册函数,线程创建函数) 回调函数三个特点:事件触发,自动运行,函数指针 ============== 参数: 值传递: 形参和实参是两个变量 地址传递: 通过地址可以访问同一块内存 ============== 被调函数向主调函数返回值得三种方式: 1.返回值 2.地址传递 3.全局变量 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx程序结构xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 种类: 顺序结构,分支结构,循环结构 分支结构: if switch 循环结构: while for 跳转语句: break:跳出循环 continue:跳出本次循环; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx内存管理xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 内存区间分类:栈区 堆区 全局变量及静态变量区/静态存储区 代码区 malloc free =============== 栈区: 此存储方式的变量的分配和释放都是自动进行的; 堆区: 用于动态分配,在程序运行时分配空间 ,用malloc手动申请,手动free释放 静态存储区: 内存在编译时分配好,程序结束才释放例如:全局变量,静态变量,字符串常量。 代码区: 存放程序代码,只读 =============== malloc和free:两个配对使用; malloc 格式: (void *)malloc(size); 返回值:成功返回申请内存的首地址,失败返回NULL; free 格式: free(堆区指针) 注意: 不能重复释放 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx存储模型xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 从不同的角度分析:生存周期,作用域,种类; ========== 生存周期: 静态存储:程序运行时就分配存储空间,运行结束才释放内存 动态存储:程序运行时动态分布存储空间,使用完毕立即释放 ========== 作用域: 局部变量; 定义;定义在函数模块内部的变量, 作用域;仅在函数模块内部有效 运行周期:局部变量在函数模块进入堆栈式生成,在弹出堆栈时消亡。 全局变量: 定义:定义在所有函数模块之外; 作用域:源文件 使用:可以一次定义,多次声明,声明时加修饰符extern; ========== 五种存储模型:1 auto 2 register 3 静态空链接 4 静态外部链接 5 静态内部链接 ========== auto(自动) 局部变量默认是auto存储类型 动态存储,作用域函数模块内部,空连接,无默认初始化 =========== register(寄存器) 动态存储,作用域函数模块内部,空连接,无默认初始化 保存在cpu的寄存器中,则变量不能使用取地址符,不能修饰全局变量,长度不大于整型长度。 =========== 静态 空连接 static修饰局部变量:静态存储,作用域函数模块内部,空连接,默认初始化零 =========== 静态 内部链接 static修饰全局变量:静态存储,作用域函数本文件,内部连接,默认初始化零 =========== 静态 外部链接 全局变量:静态存储,作用域源文件 外部链接,默认初始化零 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx关键字xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ypedef define const typedef:为变量类型取一个易记且意义明确的名字 typedef unsigned long uint32 ========== define: 预处理指令,实际就是符号替换。 ========== const;定义常变量 const int a;定义常量a const int *a;定义*a为常量 int *const a;定义指针常量a ========== 头文件防止重复包含