STM32常用的C语言知识要点

关键字

位数

表示范围

stdint关键字

ST关键字

char

8

-128 ~ 127

int8_t

s8

unsigned char

8

0 ~ 255

uint8_t

u8

short

16

-32768 ~ 32767

int16_t

s16

unsigned short

16

0 ~ 65535

uint16_t

u16

int

32

-2147483648 ~ 2147483647

int32_t

s32

unsigned int

32

0 ~ 4294967295

uint32_t

u32

long

32

-2147483648 ~ 2147483647

unsigned long

32

0 ~ 4294967295

long long

64

-(2^64)/2 ~ (2^64)/2-1

int64_t

unsigned long long

64

0 ~ (2^64)-1

uint64_t

float

32

-3.4e38 ~ 3.4e38

double

64

-1.7e308 ~ 1.7e308

重点在于stdint关键字代表的意思。

C语言宏定义

关键字:#define

用途:用一个字符串代替一个数字,便于理解,防止出错;提取程序中经常出现的参数,便于快速修改

定义宏定义:

      #define ABC 12345

引用宏定义:

      int a = ABC;    //等效于int a = 12345;

C语言typedef

关键字:typedef

用途:将一个比较长的变量类型名换个名字,便于使用

定义typedef:

      typedef unsigned char uint8_t;

引用typedef:

       uint8_t a; //等效于unsigned char a;

C语言结构体

关键字:struct

用途:数据打包,不同类型变量的集合

定义结构体变量:

      struct{char x; int y; float z;} StructName;

      因为结构体变量类型较长,所以通常用typedef更改变量类型名

引用结构体成员:

      StructName.x = 'A';

      StructName.y = 66;

      StructName.z = 1.23;

或  pStructName->x = 'A';   //pStructName为结构体的地址      pStructName->y = 66;

      pStructName->z = 1.23;

C语言枚举

关键字:enum

用途:定义一个取值受限制的整型变量,用于限制变量取值范围;宏定义的集合

定义枚举变量:

      enum{FALSE = 0, TRUE = 1} EnumName;

      因为枚举变量类型较长,所以通常用typedef更改变量类型名

引用枚举成员:

      EnumName = FALSE;

      EnumName = TRUE;

C语言指针

指针是就是相当于地址,在定义变量的时候,会在内存存放N个空间的字节,N取决于定义的数据类型,例如int 的有4个空间,指针指的是该4空间的第一个地址。

Int a=4;

Int *p;

P=&a;  (取a的地址)

*p;  (读取a地址的内容)

P++;  (地址向下取,在上述的int类型的时候,地址的值会+4)

数组的本质就是指针      int a[]={4,6,11}      a就是一个地址,所以不再需要&a。     int *p; (表示的是指针类型,空间大少取决电脑的位数)

a[0]等同于*(a)     a[1]等同于*(a+1)    如果a++; 地址会+1,因为数组就是一个整体。

指针的应用

  1. 传递参数

>使用指针传递大容量的参数,主函数和子函数使用的是同一套数据,避免了参数传递过程中的数据复制,提高了运行效率,减少了内存占用。

解释:如果子函数接收的是普通的形参变量,会在内存复制一份一样的,不会影响主函数的数据,但当数据比较大时候会浪费很多内存。使用指针传参直接访问主函数的数据,减少内存的浪费,也可以在指针变量前添加const限定子函数不能修改内容。

使用指针传递输出参数,利用主函数和子函数使用同一套数据的特性,实现数据的返回,可实现多返回值函数的设计。

解释:子函数return不用返回值,因为子函数使用的就是主函数的数据,主函数把需要的改变的值传给子函数,子函数可以修改,最后主函数读出来。就相当于实现了子函数的多个返回值。

  1. 传递返回值

将模块内的公有部分返回,让主函数持有模块的“句柄”,便于程序对指定对象的操作

解释:不同模块(相当于不同的文件)之间的变量和函数是不能直接使用的,往往需要定义.h文件和extern来调用,但这种会公开使用不利于封装。此时可以用数组指针可以直接使用。

例如:

/******************/

Int Time[]={78,96,55};

Int *GetTime(void)

{

Return Time;

}

/******************/

/**********/

Int main()

{

Int *pt;

pt=GetTime();//调用

{

/************/

这两个函数都存在于不同的模块文件里

  1. 直接访问物理地址下的数据

访问硬件指定内存下的数据,如设备ID号等将复杂格式的数据转换为字节,方便通信与存储

解释:当某设备的ID号给出地址时,可以 *地址 把设备的ID号读取

本文是跟着江科大学习,这是本人的学习笔记,如有侵权请联系本人删除!

猜你喜欢

转载自blog.csdn.net/m0_71827453/article/details/131755200
今日推荐