news 2026/5/30 18:43:58

STM32学习笔记【4.C语言基础再复习】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32学习笔记【4.C语言基础再复习】

C语言基础再复习

1. 数据类型

关键字位数表示范围stdint关键字ST关键字
char8-128 ~ 127int8_ts8
unsigned char80 ~ 255uint8_tu8
short16-32768 ~ 32767int16_ts16
unsigned short160 ~ 65535uint16_tu16
int32-2147483648 ~ 2147483647int32_ts32
unsigned int320 ~ 4294967295uint32_tu32
long32-2147483648 ~ 2147483647
unsigned long320 ~ 4294967295
long long64-(2^64)/2 ~ (2^64)/2-1int64_t
unsigned long long640 ~ (2^64)-1uint64_t
float32-3.4e38 ~ 3.4e38
double64-1.7e308 ~ 1.7e308

2. 宏定义

在C语言中,宏定义是一种预处理指令,用于将一个标识符(宏名)替换为指定的字符串。这个过程称为“宏展开”或“宏替换”。宏定义是通过使用#define预处理命令来完成的。
宏定义的一般形式如下:

#define宏名 字符串

宏定义作用

  • 提升易读性:比如#define HIGH 1
  • 便于批量修改:比如#define PIN 5
  • 支持复杂操作,如算术运算和逻辑运算等
    #define AREA(x) (x * x)
    在这个例子中,我们定义了一个名为AREA的宏,它接受一个参数x,并返回x * x的结果。当程序中出现AREA(5)时,它会被替换为(5 * 5)
  • 注意:宏定义只进行简单文本替换,不做计算或求值。
    宏定义的代码不会被编译器执行或计算,在使用宏定义时需要小心避免出现副作用或错误的结果。

3. typedef

typedef是C语言中的一个关键字,用于为复杂的数据类型定义简单的别名。通过使用typedef,可以为现有的数据类型创建一个新的名称,使得代码更简洁、易读。
typedef可以用于为基本数据类型、结构体、联合体等定义别名。例如,可以定义一个名为SIZE的类型,该类型为unsigned int类型:

typedefunsigedintSIZE;

在代码中使用SIZE作为unsigned int类型的别名:

SIZE a=10;a=20;

typedef还可以用于简化指针类型的使用。例如,可以定义一个指向整数的指针类型:

typedefint*IntPtr;

之后,可以使用IntPtr作为指向整数的指针类型的别名:

Inptr p=malloc(sizeof(int));*p=10;

注意:使用typedef定义的别名不会改变原有数据类型,只是为该类型定义新名称。所以使用别名时,注意不要混淆原有数据类型和别名。

typedef与宏定义的区别:

  • 宏定义新名字在左边,typedef在右边
  • 宏定义不需要分号,typedef需要分号;
  • 宏定义一切都可以替换,而typedef只能替换数据类型
  • 宏定义只是无脑改名,而typedef会做检查。

4. 条件编译

一种预处理指令,允许根据某些条件决定是否编译某段代码。条件编译在编译时根据条件来选择性地包含或排除代码块,这对于调试、多平台支持、配置设置等场景非常有用。

C语言中的条件编译主要通过#if#ifdef#ifndef#else#elif#endif等预处理指令来实现。这些指令可以在代码的任何位置使用,以根据特定的条件来控制代码的编译。

下面是一些条件编译的示例:

  1. #if:根据条件决定是否编译某段代码
#if表达式// 如果表达式为真,则编译下面的代码#endif
  1. #ifdef:如果宏已经定义,则编译某段代码
#ifdef宏名// 如果宏已经定义,则编译下面的代码#endif
  1. #ifndef:如果宏未定义,则编译某段代码。
#ifndef宏名// 如果宏已经定义,则编译下面的代码#endif
  1. #else:在条件编译的其他指令之后使用,如果之前的条件不满足,则编译此处的代码
#ifdef宏名1// 如果宏1已经定义,则编译下面的代码#else// 如果宏1未定义,则编译此处的代码#endif
  1. #elif:用于多条件判断。类似于其他编程语言中的else if
#if表达式1// 如果表达式1为真,则编译下面的代码#elif表达式2// 如果表达式1为假且表达式2为真,则编译下面的代码#endif

这些条件编译指令可以根据需要进行组合,以实现更复杂的条件判断和代码控制。
注意:条件编译的判断是在预处理阶段进行的,因此它不会影响程序的运行时行为。

5. 结构体

C语言中的结构体(struct)是一种用户自定义的数据类型,它是有若干基本数据类型组成的一种自定义数据类型,也叫聚合类型。结构体可以包含不同类型的数据成员,并且这些数据成员可以是相同、部分相同或完全不同的数据类型。

定义结构体的语法如下:

struct结构体名{数据类型 成员名1;数据类型 成员名2;...数据类型 成员名n;};

在定义结构体后,可以在程序中使用该结构体声明变量,并为其分配内存空间。例如:

structStudent{chargender;intage;floatscore;};structStudentstu1;

上面的例子:定义一个名为Student的结构体类型,包含三个成员:gender``agescore。声明一个名为stu1的结构体变量,并为其分配内存空间。

  • 结构体变量可以用于存储具有不同属性或特征的数据,例如学生的性别、年龄和成绩。结构体中的成员可以通过点运算符(.)来访问,例如stu1.name表示访问stu1变量的name成员。
  • C语言还提供结构体数组、结构体指针等用法,灵活处理和操作结构体数据。

6. 枚举

  1. C语言中的枚举(enum)是一种用户定义的数据类型,允许为一组整数值分配有意义的名字。枚举常用于为变量的可能值定义有意义的名称,或者为编译器的内部值分配用户定义的名称。

枚举一般形式如下:

enum枚举名{常量1,常量2,...};

其中,枚举名是你给枚举类型起的名字,而常量1常量2等是该枚举类型的成员名。这些成员名在编译时会被赋予整数值,默认从0开始,每次递增1。
例如:

enumColor{RED=0,GREEN,BLUE};

定义了一个名为Color的枚举类型,它有三个成员:REDGREENBLUE。这三个成员在编译时会被赋予整数值,分别是0、1和2。

  1. 可用来限制变量取值范围。
    通过枚举,可以为变量定义一组预定义的、有意义的值,从而确保变量的取值始终在预期的范围内。

例如,编写关于星期几的程序,可用枚举来定义:

enumWeekday{MONDAY=1,TUESDAY,WEDNESDAY,THURADAY,FRIDAY,SATURDAY,SUNDAY};

然后,可以声明一个枚举类型的变量,并为其分配一个有效的星期几值:

enumWeekdaytoday;today=MONDAY;// 或者其他有效的枚举值

通过这种方式,你可以确保today变量的取值始终是MONDAYSUNDAY的范围内。
如果尝试为today分配一个无效的值,编译器有可能会报错。

7. 指针

C语言中的指针是一种特殊的变量,它存储了一个内存地址,这个地址可以是其他变量的地址,也可以是数组的元素、结构体、函数等类型的地址。通过指针,我们可以间接地访问和操作这些内存地址所指向的内容。

指针的定义和声明方式如下:

type*ptr;

其中,type表示指针所指向的数据类型,ptr是变量名。例如,定义一个指向整数的指针:

int*p;

指针的赋值可以通过取地址运算符&来实现,例如:

inta=10;p=&a;//p指向变量a的内存地址

通过指针访问其所指向的内容需要使用解引用运算符*,例如:

intvalue=*p;// 获取p所指向的整数值

指针的算术运算和关系运算
指针与整数之间的运算需要特别小心,因为可能导致内存访问越界等问题。
以下是一些C语言指针的例子:

  1. 定义并初始化指针:
intx=10;int*p=&x;//p指向变量x的地址
  1. 通过指针访问变量:
intvalue=*p;// 获取p所指向的整数值,即x的值*p=20;// 修改p所指向的整数值,即x的值
  1. 指针的算术运算:
intarr[5]={1,2,3,4,5};int*ptr=arr;// ptr指向数组的首地址inti=0;for(i=0;i<5;i++){printf("%d ",*(ptr+i));// 输出数组元素的值}
  1. 动态内存分配:
int*p=malloc(sizeof(int));// 分配一个整数的内存空间,返回指向该空间的指针pif(p!=NULL){*p=20;// 在该内存空间中存储整数值20printf("%d\n",*p);// 输出20free(p);// 释放内存空间}

通过指针可以灵活操作内存和实现复杂的数据结构,但是注意指针使用可能会导致内存泄漏、野指针等问题,需谨慎处理。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 18:42:57

新手入门电子制作:从零焊接一台FM收音机套件全攻略

1. 项目概述与核心价值最近有不少朋友问我&#xff0c;想入门电子制作&#xff0c;有没有什么项目既能练手焊接&#xff0c;又能做出一个真正能用的东西&#xff0c;做完还有成就感&#xff1f;我通常会毫不犹豫地推荐他们从一台FM收音机开始。这可不是随便说说&#xff0c;收音…

作者头像 李华
网站建设 2026/5/30 18:41:03

打破Windows与AirPods的隔阂:AirPodsDesktop深度体验指南

打破Windows与AirPods的隔阂&#xff1a;AirPodsDesktop深度体验指南 【免费下载链接】AirPodsDesktop ☄️ AirPods desktop user experience enhancement program, for Windows and Linux (WIP) 项目地址: https://gitcode.com/gh_mirrors/ai/AirPodsDesktop AirPods在…

作者头像 李华
网站建设 2026/5/30 18:40:25

AI工具数据泄露风险全景扫描:5类高危场景+3步紧急止损法

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI工具数据隐私保护指南 在使用AI工具&#xff08;如大语言模型API、本地部署推理服务或SaaS型AI平台&#xff09;时&#xff0c;原始输入数据可能包含敏感字段——例如用户身份证号、手机号、医疗记录…

作者头像 李华
网站建设 2026/5/30 18:35:05

SRC挖洞必备:用Eeyes棱眼快速整理目标C段资产(附实战避坑指南)

SRC实战&#xff1a;用Eeyes棱眼高效定位C段资产的进阶技巧在漏洞挖掘和攻防演练中&#xff0c;快速准确地识别目标的真实资产是成功的关键第一步。许多企业会使用CDN来隐藏真实服务器IP&#xff0c;这给安全研究人员带来了不小的挑战。本文将分享如何利用Eeyes棱眼工具&#x…

作者头像 李华