嵌入式开发中常用C语言知识

本文详细介绍了C语言中的数据类型,包括整型、浮点型、进制数转换、ASCII码和补码的概念。接着讨论了算数运算符、关系运算符和逻辑运算符的使用,以及基本语句如选择语句、循环语句。此外,还涵盖了函数的定义、调用和类型,指针的定义、应用以及数组和结构体的定义与使用。最后提到了枚举、联合体和预编译的知识。
摘要由CSDN通过智能技术生成

目录

第一章:数据类型

一、整型

1、8位:单字节

2、16位:双字节

3、 32位:四字节

二、浮点型

三、进制数

1、二进制

2、十进制

3、十六进制

4、进制转换

四、ASCII码

五、补码

1、原码

2、反码

3、补码

 第二章:算数运算符

一、赋值: = 

二、加:+ ;减:- ;乘:* ;除 : /

三、取余:%

四、加一操作符:++

五、减一操作符:- -

六、组合应用

 第三章:关系运算符

一、等于或不等于

二、大于或大于等于

三、小于或小于等于

四、三目运算符

 第四章:逻辑运算符

一、逻辑与或非

1、逻辑与

2、逻辑与

3、逻辑非

二、按位与或反

1、按位与

2、按位或

3、按位取反

三、按位异或

四、左移与右移

第五章:基本语句

一、基本语句

1、表达式语句

2、复合语句

二、选择语句

1、if语句

2、if-else语句

3、if嵌套语句

三、开关语句

四、while循环语句

1、while循环语句

2、do-while循环语句

五、for循环语句

第六章:函数

一、函数的定义

1、函数类型

2、函数名称

3、形参列表

4、函数体

二、函数的调用

1、函数的调用

2、函数的声明

三、内部函数与外部函数

1、内部函数

2、外部函数

四、标准库函数

1、编译软件自带的库文件

2、单片机厂商提供的库文件

五、中断服务函数

第七章:指针

一、指针的定义

1、指针的定义

二、数据指针的定义

1、数据类型

2、*

3、标识符

三、数据指针的应用

1、基本赋值应用

2、函数传递应用

四、函数指针的定义

五、函数指针的应用

第八章:数组与结构体

一、数组定义

1、一维数组

2、二维数组

二、数组的应用

1、一维数组

2、二维数组

三、结构体的定义

1、基础数据变量

2、数据指针变量

3、函数指针变量

四、结构体的应用

五、结构体指针

1、定义结构体指针

2、通过结构体指针调用结构体变量

3、结构体指针作为函数形参传递

第九章:枚举、联合体与预编译

一、枚举的定义与应用

二、联合体的定义与应用

三、预编译介绍

 1、预编译应用于头文件

 2、预编译应用于编程

四、预编译关键字—include跟define 

1、#include <头文件名.h>

2、#define 定义宏

第十章:常用关键字

一、常用关键字

1、数据类型声明


第一章:数据类型

一、整型

1、8位:单字节

signed char  -128~127

unsigned char 0~255

2、16位:双字节

signed [short] int -32768~32767

unsigned [short] int o~65535

3、 32位:四字节

signed [long] int -2147483648~2147483647

unsigned [long] int 0~4294967295

二、浮点型

四字节 float 3.4E-38~3.4E+38

三、进制数

1、二进制

00、01、10、11...

2、十进制

1、2、3、4、5、6、7、8、9、10、11、12...

3、十六进制

0x00、0x01、0x02、0x03、0x04、0x05、0x06、0x07、0x08、0x09、0x0A、0x0B、0x0C、0x0D、0x0E、0x0F、0x10、0x12...

4、进制转换

二进制-十进制:0b1101 = 2^3+2^2+1 = 8+4+1 = 13

二进制-16进制:0b11101101 = 0xED

其他自己搜把,懒得打字了简单的

四、ASCII码

五、补码

1、原码

基本概念:第一位表示符号,其余位表示值

[11111111,01111111] => [-127,127]

2、反码

基本概念:正数的反码是本身;负数的反码是原码的基础上符号位不变,其余位取反。

[11111011]原 => [11111011]反

[11111011]原 => [10000100]反

3、补码

基本概念:正数的补码是本身;负数的补码是原码的基础上符号位不变,其余位取反后加1(反码加1)。

[11111011]原 => [11111011]补

[11111011]原 => [10000100]反  => [10000101]补

如果溢出,可以参考补码溢出

补码的作用:方便计算机用加法的形式计算负数,简化CPU运算

 第二章:算数运算符

一、赋值: = 

二、加:+ ;减:- ;乘:* ;除 : /

单片机内部都有累加器ALU,做加减法比较快尽量少做乘法;整数相除时,舍弃余数。例:a = 8 / 3 , a的值为2

三、取余:%

除法与取余,通过配合使用方便提取与转换数据

比如数据57,提取十位和个位,57/10  = 5, 57%10 = 7。

比如数据57,转换为16进制,57/16 =3, 57%16 = 9。为0x39

四、加一操作符:++

例如:a++,++a

五、减一操作符:- -

例如:a- -,- -a

操作符++,- -在前或在后,a的值最终结果都一样,区别是如果在判断语句里,操作符在a前边时,a先加减再判断,操作符再后边时,先判断再加减。

六、组合应用

a += 3 => a = a + 3;

a - = 3 => a = a - 3;

a *= 3 => a = a * 3;

a / = 3 => a = a / 3;

a %= 3 => a = a % 3;

 第三章:关系运算符

关系运算符是两个值进行比较,返回一个真/假值,一般用在选择,循环语句中

一、等于或不等于

符号为:= ,!=

例:

if ( a = 3){};

if(a != 3){};

注意 == 与 = 的区别,= 是赋值运算符,,== 是关系运算符。比如,if( i = 2){}是错误的表达方法,if(i == 2){}是正确的表达方法。

二、大于或大于等于

符号为:> ,>=

例:

if ( a > 3){};

if(a >= 4){};

三、小于或小于等于

符号为:< ,<=

例:

if ( a < 3){};

if(a <= 3){};

四、三目运算符

三目运算符,又称条件运算符,是唯一一个有三个操作数的运算符,又称三元运算符,一般用于赋值语句中。

形式:条件表达式1 ?条件表达式2 :条件表达式3

运算规则:如果条件表达式1为真,则运算条件表达式2,并返回条件表达式2的值。如果条件表达式1为假,则运算条件表达式3,并返回条件表达式3的值

例:

MAX = (a > b) ? a : b;

如果a > b , MAX = a;

如果a < b , MAX = b;

这样可以找出a和b里较大的值。

 第四章:逻辑运算符

一、逻辑与或非

逻辑与或非,运算对象是布尔值(1或0,真或假),类似数字电路的与门,或门,非门。与关系运算符一起搭配,一般用在选择语句与循环语句中。

1、逻辑与

符号为&&。参与运算的两个表达式都为真,结果才为真,否则为假。

例:

uint8_t a = 3,b = 5;

if ((a ==3)&&(b==5)){

执行};

2、逻辑与

符号为||。参与运算的两个表达式有一个真,结果就为真,两个都假时,才为假。

例:

uint8_t a = 3,b = 5;

if ((a ==4)&&(b==5)){

执行};

3、逻辑非

符号为!。参与运表达式的为真时结果为假;参与运算的表达式为假时结果为真。

例:

bit Flag = 0;

if (! Flag){

执行};

二、按位与或反

与(AND, &, *),或(OR, |, +),异或 (xor, NEQV, ^), 等价(EQV, =, ==)以及非(NOT, ~, !)

按位与或反,运算的对象是8位,16位,32位的整型数据,运算数据的每一比特位按逻辑与或非操作

1、按位与

符号为&。参与运算的两个数据按二进制进行逻辑与操作。

uint8_t a = 0xAA,b = 0x55,c;

c = a & b = 0x00;

特殊应用:

清零第0位:运算数据&0xFE  //11111110   ~(0x01<<0)     ps:以后都这么应用    

清零第1位:运算数据&0xFE  //11111101   ~(0x01<<1)     

清零第2位:运算数据&0xFE  //11111011   ~(0x01<<2)     

清零第3位:运算数据&0xFE  //11110111   ~(0x01<<3)     

清零第4位:运算数据&0xFE  //11101111   ~(0x01<<4)     

清零第5位:运算数据&0xFE  //11011111   ~(0x01<<5)     

清零第6位:运算数据&0xFE  //10111111   ~(0x01<<6)     

清零第7位:运算数据&0xFE  //01111111   ~(0x01<<7)     

2、按位或

符号为|。参与运算的两个数据按二进制位进行逻辑或操作。

例如:
uint8_t a = 0xAA,b = 0x55,c;

c = a|b = 0xFF;

特殊应用:

置位指定比特位

置位第0位:运算数据|0x01   //00000001   (0x01 << 0)

置位第1位:运算数据|0x02   //00000010   (0x01 << 1)

置位第2位:运算数据|0x04   //00000100   (0x01 << 2)

置位第3位:运算数据|0x08   //00001000   (0x01 << 3)

置位第4位:运算数据|0x10   //00010000   (0x01 << 4)

置位第5位:运算数据|0x20   //00100000   (0x01 << 5)

置位第6位:运算数据|0x40   //01000000   (0x01 << 6)

置位第7位:运算数据|0x80   //10000000   (0x01 << 7)

3、按位取反

符号为~。参与运算的数据按二进制位进行逻辑非操作。

例:

uint8_t a = 0xAA,b = 0x55,c;

c = ~a = 0x55;

c=~b = 0xAA;

三、按位异或

符号为^,参与运算的两个数据按二进制进行”异或“运算

运算规则:0^0 = 0; 0^1 = 1; 1^0 = 1; 1^1 = 0;

例:

uint8_t a = 0xAA,b = 0x55,c;

c = a^b = 0xFF ;

uint8_t a = 0xFF,b = 0xFF,c;

c = a^b = 0x00 ;

特殊应用:

取反指定比特位

取反第0位: 运算数据^0x01  //00000001   (0x01 << 0)

取反第1位: 运算数据^0x02  //00000010   (0x01 << 1)

取反第2位: 运算数据^0x04  //00000100   (0x01 << 2)

取反第3位: 运算数据^0x08  //00001000   (0x01 << 3)

取反第4位: 运算数据^0x10  //00010000   (0x01 << 4)

取反第5位: 运算数据^0x20  //00100000   (0x01 << 5)

取反第6位: 运算数据^0x40  //01000000   (0x01 << 6)

取反第7位: 运算数据^0x80  //10000000   (0x01 << 7)

四、左移与右移

符号为 <<与>>,运算的对象是8位,16位,32位的整型数据,把数据左移或者右移若干位。向左移动时,高位溢出,低位补零;向右移时,低位溢出,高位补零

例:

uint8_t a = 0xAA,c;

c = a<<5 =  0x40;

c = a>>3 = 0x15;

第五章:基本语句

一、基本语句

1、表达式语句

以分号”;“结束。

例如:
语句1: a += 2;

语句2:printf("zilidashen!");

2、复合语句

由若干个表达式语句组成,用大括号”{}“组合起来而形成的功能模块。复合语句不需要”;“来结束,但内补的表达式语句需要”;“来结束。

例子:

{

        语句1;

        语句2;

}

二、选择语句

1、if语句

if(条件表达式){

        语句;

}

执行过程:如果条件表达式为真,则执行语句;为假则不执行语句。

2、if-else语句

if(条件表达式){

        语句1;

}

else{

        语句2;

}

执行过程:如果条件表达式为真,则执行语句1;为假,则执行语句2。

3、if嵌套语句

嵌套一:

if(条件表达式1){

        if(条件表达式1){

                if(条件表达式1){

               。。。。

                 }

        }

}

嵌套二:

if(条件表达式1){

        if(条件表达式2){

        }

        else{

        }

}

嵌套三:

if(条件表达式1){

        if(条件表达式2){

        }

}

else{

       if(条件表达式3){

        }

 }

三、开关语句

开关语句是一种多分支选择语句,通常用于状态机编程中,形式如下:

switch(条件表达式){

case 常量表达式1  :分支语句1;

case 常量表达式2  :分支语句1;

                。。。

case 常量表达式n  :分支语句n;

default :分支语句d;

}

执行过程:将条件表达式与case 后的常量表达式的值逐个比较,若相等,则执行相应后面的语句(包括后面的case和default分支语句)若都不相等,则执行default后边的语句。

Note:

1、case分支语句通常通常以break语句结尾,确保只执行一个分支。

2、case分支语句为复合语句时可以加”{}“,也可以不加。

switch(条件表达式){

case 常量表达式1  :分支语句1;break;

case 常量表达式2  :{分支语句1;break;}

                。。。

case 常量表达式n  :分支语句n;break;

default :分支语句d;

}

应用于状态机

switch(状态机状态){

case STA1  :状态机状态 = STA2;break;

case STA2  :状态机状态 = STA3;break;

                。。。

case STAn  :状态机状态 = STA1;break;

default :分支语句d;

}

四、while循环语句

1、while循环语句

while(表达式){

        语句;

}

执行过程:

1、若表达为真,执行语句。

2、反复判断表达式,若为真,则反复执行语句。

3、若表达式为假,则退出循环,继续往下运行。

死循环

while(1){

        语句;

}

Note:

while循环通常可以与break,continue等语句配合使用。

break:退出循环体。

continue:中断语句,结束本次循环。

可以退出的死循环:

while(1){

        语句;

        if(条件表达式){

                break;//退出循环

                }

}

计算1到100的偶数和:

unsigned char i;

unsigned int sum = 0;

i = 1;

while(i <= 100){

        if( (i%2) == 1){

                i++ ;

                continue;

        }

       sum +=  i ++  ;

}

2、do-while循环语句

do{

        语句;

}

while(表达式);

执行过程:

1、执行语句。

2、反复判断表达式,若为真,反复运行表达式。

3、若表达式为假,则退出循环,继续往下 执行。

特殊应用:

只执行一次的表达式

do{

        语句;

}

while(0);

五、for循环语句

语句结构:

for([初值设置表达式],[循环条件表达式],[更新表达式]){

        语句;

}

执行过程:
1、初始值设置表达式。

2、判断循环条件表达式,为真,执行语句;为假退出循环。

3、执行更新表达式。

4、重复步骤2和步骤3,直到循环条件表达式为假,退出循环。

例子:

计算1到100的和

#include <stdio.h>

int main()
{

        unsigned int sum;

        for(unsigned char i;i<=100;i++){

                sum += i;

}
    /*  Write C code in this online editor and run it. */
   printf("sum = %d \n",sum);
   
   return 0;
}

死循环

for(;;){

        语句;

}

可以退出的死循环

for(;;){

        语句;

        if(条件表达式){

               break;

         }

}

第六章:函数

一、函数的定义

函数是一段可以重复使用的功能代码,用来独立的完成某个功能。

作用:简化代码,方便阅读,重复利用,提高效率。

函数定义的一般形式:

函数类型 函数名(形参列表){

        函数体;

}

1、函数类型

函数的返回值类型

void:空类型,无返回值。

unsigned char:返回无符号字符型。

float : 返回浮点型。

unsigned int* :返回指向无符号整型的指针。

2、函数名称

命名需根据功能,规范命名

LED_OFF

LED_ON

Delay_ms

System_Init

3、形参列表

函数被调用时,传递的参数,可以没有,也可以有多个。

(viod): 空类型,无传递形参

(unsigned char LEN,float ADC) : 两个形参

(float* pfADC): 指针形参

4、函数体

函数的具体功能实现

形式如下:

{

        [局部变量定义]

        复合语句

        [return 返回值]

}         

补充

全局变量:作用范围为全部,一般为整个c程序

局部变量:做用范围为局部,一般为内部函数

二、函数的调用

1、函数的调用

调用形式如下:

函数名(实际参数表);

无返回值,直接调用

Delay_ms (100);//延时100ms

LED_ON();//打开LED灯

有返回值,可作用于表达式或作为其他函数的形参:

a = Sum(100);//计算1~100的和,然后赋给a

Temperature = Lookup_Table(Get_ADC(ADC1));//查表获取温度

2、函数的声明

1、被调用的函数位于调用函数后边

2、被调用的函数位于其他C文件

声明形式如下

[extern] viod LED_ON(void);

[extern] void Delay_ms (unsigned int )

关键字extern 在此的的作用:声明一个外部函数

三、内部函数与外部函数

1、内部函数

用static声明,不能被外部函数调用。

2、外部函数

用extern声明,可以被外部函数(其他c文件)调用。

Note:

函数默认为extern

调用外部函数时,需要进行声明,一般用头文件声明。

#include <stdio.h>

#include <LED.h>

四、标准库函数

1、编译软件自带的库文件

2、单片机厂商提供的库文件

调用方法:利用include关键字引用。

#include <STC8.h>

//STC8头文件,包含STC8单片机的所有寄存器定义

#include <intrins.h>

//主要包含空指令函数,循环移位函数等

#include <string.h>

//主要包含字符串处理函数

#include "stdio.h"

//主要包含标准I/O功能函数,比如 printf打印输出

#include <stdlib.h>

//主要包含随机数,申请与释放内存函数等

Nota:

" " : 先在工程路径找,再在系统路径找

< > :先在系统路径找,再在工程路径找

五、中断服务函数

单片机产生中断时,调用的函数。

STC系列单片机中断函数定义如下

void 函数名()interrupt  中断号{

        函数体;

}

interrupt :标识符,表明此函数为中断函数。

中断号 : 中断入口

举例:

void INT_isr()  interrupt 0{

}

第七章:指针

一、指针的定义

1、指针的定义

指针是一种保存变量地址的变量。

深入理解:

①定义一个变量a,系统分配内存。

unsigned char a = 10;

&a  ;// &取址符

②定义一个指针P,系统分配内存。

unsigned char* P = NULL;

③ 将指针P指向变量a

 P = &a;

2、为什么使用指针

①指针的使用可以使得不同区域的代码,轻易的共享内存数据,这样可以使得程序更加快速高效。

②C语言中一些复杂的数据结构往往需要指针来构建,如链表,二叉树。

③C语言是传值调用,而有些操作传值调用是无法完成的,如通过被调用函数来修改调用函数的对象,但是这种操作可以用指针来完成,并且不违背传值调用。

二、数据指针的定义

指针变量的定义与一般变量的定义类似,一般形式如下:

数据类型 *标识符

1、数据类型

void、unsigned char、signed int、float 、结构体

2、*

表示定义的变量为指针

3、标识符

指针变量名

举例:

void *P

定义了空类型指针,赋值之前,需要通过强制类型转换符进行转换

unsigned char *P

signed int *P

float *P

Nota:

定义指针后,如果没有初始化赋值,此指针为野指针,不可对其进行操作,否则会产生不可预测的后果。如果暂时不赋值,可以初始化成NULL

三、数据指针的应用

定义指针并赋值后,此时指针指向变量,可以通过指针操作变量,操作格式为:

(*指针标识符)

1、基本赋值应用

unsigned char a;

unsigned char *P = &a;

此时,指针P存放的是变量a的地址,也就是指针P指向a。

a = 100;

(*P) = 100;

效果是一样的

2、函数传递应用

unsigned char a[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

void Water_LED(unsigned char *P){

        for(unsigned int i = 0; i < 8; i ++ ){

        P1 = *(P+i)

        }

}

函数调用形式:

Water_LED(a);

Water_(&a[0]);

四、函数指针的定义

如果在程序中定义了一个函数,那么在编译的时候系统就会为这个函数分配一段储存空间,这段储存空间的首地址称为这个函数的地址,函数名表示的就是这个地址。既然是地址,我们就可以定义一个指针来存放,这个指针变量就叫做函数指针变量,简称函数指针。

有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可以引用其他类型变量一样。

定义函数指针的一般形式为:

数据类型 (*标识符)([形参列表])

1、数据类型:说明函数的返回类型。

2、(*标识符):括号不能省略,括号改变了优先级。若省略整体则称为一个函数声明,声明了一个返回值类型是指针的函数。

3、形参列表:表示指针变量指向函数所带来的参数列表。

举例:

int func(int x);  //声明一个函数

int (*f)(int x);  //声明一个函数指针

f = func;  //将函数func的首地址赋给指针f

Nota:

指针函数和函数指针

1、指针函数

返回值是指针的函数,其本质还是一个函数。

其定义格式如下:

数据类型* 函数名([形参列表])

2、函数指针

指向函数的指针,其本质是一个指针。

数据类型(*标识符)([形参列表])

五、函数指针的应用

定义函数指针并赋值后,此时函数指针指向了函数入口,可以通过函数指针调用函数。

调用格式:

1、(*P)(); // 无返回值,无形参

2、(*P)(unsigned char a) // 无返回值,有形参

3、b =(*P)(unsigned char a) // 有返回值有形参
高级应用:

1、回调函数

将函数指针作为参数传递

2、面向对象的结构体编程

通过结构体封装变量,数据指针,函数指针

第八章:数组与结构体

一、数组定义

数组是一组同一种数据类型的数据集合;

数组分为一维数组与二维数组;

数组必须先定义,然后才能使用,定义时可以初始化;

1、一维数组

定义:

数据类型 数组名[数组长度] = [{数组初始化}];

数据类型:字符型,整型,浮点型,指针等

数组名:数组名称,也是数组的首地址

数组长度:必须为常量

数组初始化:可以初始化,也可以不初始化

例如:

unsigned char Arr[5] = {0x22,0x85};//未初始化为零

2、二维数组

定义

数据类型 数组名[行长度][列长度][{数组初始化}];

数据类型:字符型,整型,浮点型,指针等

数组名:数组名称,也是数组的首地址

数组长度:必须为常量

数组初始化:可以初始化,也可以不初始化

例子:
unsigned char Arr[2][3] = {

        {0x22,0x66,0x77},

        {0x88,0x45,0x66}

}

二、数组的应用

1、一维数组

方法一:数组名[索引号]        Arr[0]

方法二:数组指针调用

unsignde char *Ptr = Arr

*(Ptr + 1) = Arr[1];

2、二维数组

方法一:数组名[行索引号][列索引号]   Arr[0][2] = 0x03;

方法二 : 数据指针调用,计算地址麻烦,很少使用

Nota:

索引号从0开始,0至数组长度-1

三、结构体的定义

结构体是一组相同或者不同数据类型构成的新的数据类型

数据类型可以是字符型,整型,浮点型,数据指针、函数指针

结构体要先声明类型,再定义变量,然后才能使用,定义时尽量初始化

结构体类型定义:

struct 结构体名称 = {结构体元素表};

实际使用定义方法:

typedef struct [结构体名称]{

        基础数据变量;

        数据指针变量;

        函数指针变量;

}结构体名_t;

Note:

typedef 关键字,数据类型重命名

typedef uint8_t   unsigned char 

typedef uint16_t   unsigned short int 

typedef uint32_t   unsigned long int 

1、基础数据变量

字符型、整型、浮点型等。

2、数据指针变量

一般用来指向数组

3、函数指针变量

用来指向函数

例如:

typedef struct {

        unsigned char ucTx_Flag;

        unsigned char *pucSendBuffer;

        void (*Send_Array)(unsigned char *,unsigned int );

}UART_t;

Note:

1、外设一般由变量,数组,函数组成,通过上面定义的结构体变量,可将外设进行封装。

2、通过结构体访问外设,编程更加方便、程序可读性更好、方便移植。

3、此方法即为单片机实战的面向对象的编程思维,结构体编程。

四、结构体的应用

定义结构体后,此时系统并未分配内存,不可调用。在c文件中,通过结构体类型定义结构体变量后,方可调用结构体。

常规应用方法:

1、.h文件中定义结构体类型

2、.c文件中定义结构体变量

3、.h文件中声明结构体变量为外部变量

4、其他.c文件即可调用结构体变量

调用方法:

结构体名称.元素

例子:

unsigned ucSendBuffer[10];

static void UART1_Send_Array(unsigned char *,unsigned int);

UART_t  UART1 ={

        0,

        ucSendBuffer,

        UART1_Send_Array

};

调用结构体变量:

UART1.ucTx_Flag =1;

*(UART1.pucSendBufffer +1) = 10;

UART1.Send_Array(Ptr Arr,LEN);

五、结构体指针

通过结构体指针,不仅可以访问结构体变量,同时,也可作为函数的实参进行传递,实现更多灵活多变的功能。

1、定义结构体指针

UART_t *Ptr_UART_t =&UART;

2、通过结构体指针调用结构体变量

Ptr_UART_t -> ucTx_Flag = 1;

*(Ptr_UART t -> pucSendBufffer + 1) = 10;

Ptr_UART_t -> Send_Array(Ptr_Arr,LEN);

3、结构体指针作为函数形参传递

//定义函数

void Protocol_Analysis(UART_t *UART )

UART_t* const COM = UART;//定义实参

//调用结构体

COM -> ucTx_Flag = 1;

(COM ->pucSendBufffer + 1) = 10;

COM ->Send_Array(Ptr_Arr,LEN);

//调用函数

Protocol Analysis(UART1);

第九章:枚举、联合体与预编译

一、枚举的定义与应用

枚举是集合若干个整型常量构成的新的数据类型

枚举类型定义:

enum 枚举名{枚举列表}变量列表;

实际的定义方法:

typedef enum 枚举名{

        枚举值列表

}枚举名_t;

例子:

typedef enum {

        FALSE = 0,

        TRUE  =FALSE

}bool_t;

Note:
1、如果枚举值列表不赋值,默认第一项取值为0,第二项自动加1,依次类推;建议实际编程中,尽量赋值。

2、定义枚举类型后,此时系统并不会分配内存,但可以将枚举类型列表中当常量进行使用,相等
于宏定义#define;

3、通过枚举类型定义枚举变量后,系统分配内存,枚举变量取值范围仅限于枚举类型列表。

二、联合体的定义与应用

联合体是若干个数据元素共用内存构成新的数据类型

联合体类型定义:

union 联合体名称{成员列表}变量列表;

实际使用的定义方法:

typedef union [联合体名称]{

        成员列表;

}联合体名_t;

例子:

typedef union {

        unsigned char a;

        float b;

        unsigned int c;

}temp_t;

Note:
1、联合体类型与结构体类型的定义方法很相似,只是将关键字struct改为union。 但是它们在内存分配上有着本质的区别,结构体变量所占用的内存长度是所有元素所占用内存的总和,而联合体变量占用的内存长度是其中最长元素的长度;
2、联合体类型提供了一种能够在同一内存内处理不同类型数据的方法,适当使用联合体空类型可以节约内存空间;
3、与结构体一样,联合体也需要先定义数据类型,再定义变量,方可引用元素
4、与结构体一样,联合体引用元素的方法为 联合体变量名.联合体元素
5、与结构体一样,也可以定义联合体指针进行元素引用,联合体指针名->联合体元素

三、预编译介绍

预处理指令是以#开头的代码,#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源码做某些转换。下面是部分预处理指令:

 1、预编译应用于头文件

 2、预编译应用于编程

四、预编译关键字—include跟define 

1、#include <头文件名.h>

包含一个头文件。

2、#define 定义宏

例如:

#define LED_ON  P55 = 1

#define LED_OFF  P55 = 0

作用:

1、提高代码可读性

2、方便代码修改

3、方便代码移植

第十章:常用关键字

一、常用关键字

1、数据类型声明

空类型

有符号字符           unsigned char             

无符号字符           signed char             

有符号短整型        unsigned [short] int              

无符号短整型        signed [short] int

有符号长整型        unsigned long int

无符号长整型        signed long int

单精度浮点型        float

双精度浮点型        double

结构体                  struct

枚举                      enum

联合体                  union     

2、储存种类声明

auto        声明局部变量,默认此类型

register   使用CPU内部寄存器的变量

extern     声明外部变量

static       声明静态变量

const       声明常量变量

volatile    声明变量可能被外部改变

typedef   数据类型重定义

3、程序语句

条件选择:if - else

开关语句:switch - case - default

循环语句:for 、while、do - while

函数返回:return

退出最内层循环体:break

转向下一次循环:continue

4、预编译

包含一个头文件:include

宏定义:difine

5、运算符

计算表达式或者数据类型的字节数:sizeof

  • 8
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值