嵌入式软件开发必备C知识—类型别名、结构体、指针、代码规范

一、类型别名(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等语句单独占一行,一般无论有多少行执行语句,都要加括号:{}。

猜你喜欢

转载自blog.csdn.net/zywcxz/article/details/131018557
今日推荐