c基础语法-常用关键字
变量
在计算机中,整数是以补码形式存放的。所以如果整数的最高位是1,有符号数的话就是负数;如果是无符号数,则都表示正数
整形 int ->32 -2^31~2^31
无符号整形 unsigned int ->32 2^31
volatile unsigned int
volatile 不稳定的,易变的,告诉编译器要谨慎处理
什么时候用 volatile,3种情况
1.中断服务函数的共享变量
2.多线程的共享变量
3.寄存器变量 (举例,传感器拿到数据更改寄存器的某一位)
相同点: 这三种情况 都属于 不属于main函数控制的范围
在程序设计中 使用 int short char
typedef unsigned int u32
typedef unsigned short u16
typedef unsigned char u8
一个c代码文件编译过程:
预处理,词法分析,语法分析,语义分析,编译为汇编,链接库文件
a.c/a.h->a.i->a.s->a.o
一个c在执行时包括什么?
代码段 .text
数据段 .data 被初始化的全局变量 volatile unsigned int b=1;
BSS(未初始化数据段) 没有被初始化的全局变量 unsigned int a;
栈
堆
关键字
static------extern
作用1 限定作用域
作用域: 在一个.c中, 在一个函数中, 定义了static变量,不做初始化时,默认会自动初始化为0(数据放在数据段.data 的静态区)
作用2 在一个函数中定义static时,调用过程中其值不变
作用3 在模块中定义static时, 被定义者只能被本模块使用(类似于私有变量/函数)
#define 仅仅是字符串常量替换,数据类型跟平台相关
const 只读, 能指定数据类型
#define PI 3.141592653 (数据类型不明确,需要看平台)
const float PI=3.141592653 (精确指定用float类型)
typedef 类型 别名
typedef struct Student{
int age;
char name;
}Stu;
struct Student stu1;
Stu stu1;
位运算:
& 按位与
| 按位或
! 按位取反
^ 按位异或 如果两个相应bit位相同,则结果为0,否则为1
<<(左移)
运算规则: 按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
数学意义: 在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次,左移n位就相当于乘以2的n次方。
>>(带符号右移)
运算规则: 按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。
数学意义: 右移一位相当于除2,右移n位相当于除以2的n次方。取商,余数不要。
掩码MASK
掩码的作用 提取某一位
掩码的生成 掩码= 1<<提取的位数
寄存器编程的三个手段
1.置1 flag|=MASK flag|=(1<<(想要操作的位数))
2.清0 flag&=~MASK flag&=~(1<<(想要操作的位数))
3.转置 flag^=MASK flag^=(1<<(想要操作的位数))
数组
int a[容量]
数组名 (const) 是个固定地址 (不能自加 不能赋值)
int a[32];
int* pa;
pa=a;
pa++;
函数
函数的调用就是把函数的定义地址放入pc指针寄存器
结构体
结构体指针访问成员用->,结构体访问成员用.
寄存器封装(注意:每个寄存器位数对齐操作)
typedef volatile unsigned int VU32;
typedef struct _T_Xxx_Config{
union{
struct{
VU32 enable_start :1;
VU32 read_start :1;
VU32 stdbm :1;
...
}bits;
VU32 INIT;
}adccon;
}T_Xxx_Config;
typedef T_Xxx_Config * p_XxxRegs;
p_XxxRegs p_XxxReg;
p_XxxReg->adccon.bits.enable_start=1;
p_XxxReg->adccon.bits.read_start=1;
参考:
结构体: https://www.elecfans.com/d/1433999.html
epoll: https://blog.csdn.net/armlinuxww/article/details/92803381