一、类型别名(typedef)
为现有数据类型(基础类型、构造类型)创建一个新的名字,或称为类型别名,用来简化变量的定义。
定义格式如下:
typedef 现有类型 新的名字
例如常见的几种定义类型格式
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
结构体类型别名的应用
Struct GPIO_TypeDef
{
_IO uint32_t CRL;
_IO uint32_t CRH;
......
};
Struct GPIO_TypeDef gpiox
我们可以用typedef来定义结构体,
typedef Struct
{
_IO uint32_t CRL;
_IO uint32_t CRH;
......
}GPIO_TypeDef;
GPIO_TypeDef gpiox
二、结构体
由若干基本数据类型集合组成的一种自定义数据类型,也叫聚合类型
定义格式如下:
struct 结构体名
{
成员列表;
}变量名列表(可选);
struct student
{
char *name;
int num;
int age;
char group;
float score;
}stu1,stu2;
应用举例(定义&使用)
struct student
{
char *name;
int num;
int age;
char group;
float score;
}
struct student stu3,stu4;
stu3.name = "张三";
stu.num = 1;
stu.age = 18;
stu3.group = 'A';
stu3.score = '90';
例如 stm32f1xx_hal_gpio.h
typedef struct
{
uint32_t Pin;
uint32_t Mode;
uint32_t Pull;
uint32_t Speed;
} GPIO_InitTypeDef;
三、指针
很过瘾的,变化无穷的
指针就是内存的地址
指针变量是保存了指针的变量
定义格式:
类型名 *指针变量名
char *p_str = "This is a test"; // 得到的是字符串的首地址的值,这个结果是T
*p_str: 取p_str变量的值
&p_str:取p_str变量的地址
假设我们定义首地址是0x0001
uint8_t buf[5] = {1,3,5,7,9}; //假设1的首地址是0x0002
uint8_t *p_buf = buf; 0x0002
*p_buf = 1;
p_buf[0]=1; //把指针变量当数组来用
p_buf[1]=3
p_buf++;//0x0003
*p_buf = 3;
p_buf[0]=3;
如何理解上边的过程呢?
首先我们定义一个数组buf,它的长度是5,也就是buf[0]=1;buf[1]=3;buf[2]=5;buf[3]=7;buf[4]=9;
假设buf[0]的地址是0x0002,我们定义一个指针变量p_buf指向数组,取得是数组的首地址,*p_buf是取指针变量地址的值,此时指针地址为0x0002,它的值为1,p_buf[0]将指针变量当作数组来用,下标是0,他还是当前地址的元素,还是1,p_buf[1],是地址往下走,所以p_buf[1]=3,p_buf++,是将指针变量地址+1,即地址变为0x0003,*p_buf是当前的地址的值,即为3,它的数组p_buf[0]也就是3.
指针使用的2大常见问题:
1,未分配(申请)内存就使用
2.越界使用
char *p_buf;
p_buf[0]=100;
p_buf[1]=120;
p_buf[2]=150;
错误:未分配内存,可能会导致系统奔溃
uint8_t buf[5] = {1,3,5,7,9}; //假设1的首地址是0x0002
uint8_t *p_buf = buf; 0x0002
*p_buf = 1;
p_buf[0]=1; //把指针变量当数组来用
p_buf[1]=3
p_buf++;//0x0003
*p_buf = 3;
p_buf[5]=200;
错误用法:越界使用
四、代码规范
1.所有函数/变量名字非特殊情况,一般使用小写字母。
2,注释风格使用doxgen注释风格,一般除了屏蔽外,都使用/* */进行注释。
3.TAB键统一使用4个空格对齐,不使用默认的方式进行对齐。
4.每两个函数之间,一般有且只有一个空行。
5.相对独立的程序块之间,使用一个空行隔开。
6.全局变量民命一般用g_开头,全局指针命名一般用p_开头。
7.if、for、while、do、case、switch、default等语句单独占一行,一般无论有多少行执行语句,都要加括号:{}。