什么是有效数字?
-------------------------
数据类型
运算符:
函数:
程序结构:
存储结构
内存管理
关键字:
-------------------------
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
==========
头文件防止重复包含