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

发布时间:2026/5/30 18:44:03

STM32学习笔记【4.C语言基础再复习】 C语言基础再复习1. 数据类型关键字位数表示范围stdint关键字ST关键字char8-128 ~ 127int8_ts8unsigned char80 ~ 255uint8_tu8short16-32768 ~ 32767int16_ts16unsigned short160 ~ 65535uint16_tu16int32-2147483648 ~ 2147483647int32_ts32unsigned int320 ~ 4294967295uint32_tu32long32-2147483648 ~ 2147483647unsigned long320 ~ 4294967295long long64-(2^64)/2 ~ (2^64)/2-1int64_tunsigned long long640 ~ (2^64)-1uint64_tfloat32-3.4e38 ~ 3.4e38double64-1.7e308 ~ 1.7e3082. 宏定义在C语言中宏定义是一种预处理指令用于将一个标识符宏名替换为指定的字符串。这个过程称为“宏展开”或“宏替换”。宏定义是通过使用#define预处理命令来完成的。宏定义的一般形式如下#define宏名 字符串宏定义作用提升易读性比如#define HIGH 1便于批量修改比如#define PIN 5支持复杂操作如算术运算和逻辑运算等#define AREA(x) (x * x)在这个例子中我们定义了一个名为AREA的宏它接受一个参数x并返回x * x的结果。当程序中出现AREA(5)时它会被替换为(5 * 5)。注意宏定义只进行简单文本替换不做计算或求值。宏定义的代码不会被编译器执行或计算在使用宏定义时需要小心避免出现副作用或错误的结果。3. typedeftypedef是C语言中的一个关键字用于为复杂的数据类型定义简单的别名。通过使用typedef可以为现有的数据类型创建一个新的名称使得代码更简洁、易读。typedef可以用于为基本数据类型、结构体、联合体等定义别名。例如可以定义一个名为SIZE的类型该类型为unsigned int类型typedefunsigedintSIZE;在代码中使用SIZE作为unsigned int类型的别名SIZE a10;a20;typedef还可以用于简化指针类型的使用。例如可以定义一个指向整数的指针类型typedefint*IntPtr;之后可以使用IntPtr作为指向整数的指针类型的别名Inptr pmalloc(sizeof(int));*p10;注意使用typedef定义的别名不会改变原有数据类型只是为该类型定义新名称。所以使用别名时注意不要混淆原有数据类型和别名。typedef与宏定义的区别宏定义新名字在左边typedef在右边宏定义不需要分号typedef需要分号宏定义一切都可以替换而typedef只能替换数据类型宏定义只是无脑改名而typedef会做检查。4. 条件编译一种预处理指令允许根据某些条件决定是否编译某段代码。条件编译在编译时根据条件来选择性地包含或排除代码块这对于调试、多平台支持、配置设置等场景非常有用。C语言中的条件编译主要通过#if、#ifdef、#ifndef、#else、#elif和#endif等预处理指令来实现。这些指令可以在代码的任何位置使用以根据特定的条件来控制代码的编译。下面是一些条件编译的示例#if:根据条件决定是否编译某段代码#if表达式// 如果表达式为真则编译下面的代码#endif#ifdef如果宏已经定义则编译某段代码#ifdef宏名// 如果宏已经定义则编译下面的代码#endif#ifndef如果宏未定义则编译某段代码。#ifndef宏名// 如果宏已经定义则编译下面的代码#endif#else在条件编译的其他指令之后使用如果之前的条件不满足则编译此处的代码#ifdef宏名1// 如果宏1已经定义则编译下面的代码#else// 如果宏1未定义则编译此处的代码#endif#elif用于多条件判断。类似于其他编程语言中的else if。#if表达式1// 如果表达式1为真则编译下面的代码#elif表达式2// 如果表达式1为假且表达式2为真则编译下面的代码#endif这些条件编译指令可以根据需要进行组合以实现更复杂的条件判断和代码控制。注意条件编译的判断是在预处理阶段进行的因此它不会影响程序的运行时行为。5. 结构体C语言中的结构体struct是一种用户自定义的数据类型它是有若干基本数据类型组成的一种自定义数据类型也叫聚合类型。结构体可以包含不同类型的数据成员并且这些数据成员可以是相同、部分相同或完全不同的数据类型。定义结构体的语法如下struct结构体名{数据类型 成员名1;数据类型 成员名2;...数据类型 成员名n;};在定义结构体后可以在程序中使用该结构体声明变量并为其分配内存空间。例如structStudent{chargender;intage;floatscore;};structStudentstu1;上面的例子定义一个名为Student的结构体类型包含三个成员genderage和score。声明一个名为stu1的结构体变量并为其分配内存空间。结构体变量可以用于存储具有不同属性或特征的数据例如学生的性别、年龄和成绩。结构体中的成员可以通过点运算符.来访问例如stu1.name表示访问stu1变量的name成员。C语言还提供结构体数组、结构体指针等用法灵活处理和操作结构体数据。6. 枚举C语言中的枚举enum是一种用户定义的数据类型允许为一组整数值分配有意义的名字。枚举常用于为变量的可能值定义有意义的名称或者为编译器的内部值分配用户定义的名称。枚举一般形式如下enum枚举名{常量1,常量2,...};其中枚举名是你给枚举类型起的名字而常量1、常量2等是该枚举类型的成员名。这些成员名在编译时会被赋予整数值默认从0开始每次递增1。例如enumColor{RED0,GREEN,BLUE};定义了一个名为Color的枚举类型它有三个成员RED、GREEN、BLUE。这三个成员在编译时会被赋予整数值分别是0、1和2。可用来限制变量取值范围。通过枚举可以为变量定义一组预定义的、有意义的值从而确保变量的取值始终在预期的范围内。例如编写关于星期几的程序可用枚举来定义enumWeekday{MONDAY1,TUESDAY,WEDNESDAY,THURADAY,FRIDAY,SATURDAY,SUNDAY};然后可以声明一个枚举类型的变量并为其分配一个有效的星期几值enumWeekdaytoday;todayMONDAY;// 或者其他有效的枚举值通过这种方式你可以确保today变量的取值始终是MONDAY到SUNDAY的范围内。如果尝试为today分配一个无效的值编译器有可能会报错。7. 指针C语言中的指针是一种特殊的变量它存储了一个内存地址这个地址可以是其他变量的地址也可以是数组的元素、结构体、函数等类型的地址。通过指针我们可以间接地访问和操作这些内存地址所指向的内容。指针的定义和声明方式如下type*ptr;其中type表示指针所指向的数据类型ptr是变量名。例如定义一个指向整数的指针int*p;指针的赋值可以通过取地址运算符来实现例如inta10;pa;//p指向变量a的内存地址通过指针访问其所指向的内容需要使用解引用运算符*例如intvalue*p;// 获取p所指向的整数值指针的算术运算和关系运算指针与整数之间的运算需要特别小心因为可能导致内存访问越界等问题。以下是一些C语言指针的例子定义并初始化指针intx10;int*px;//p指向变量x的地址通过指针访问变量intvalue*p;// 获取p所指向的整数值即x的值*p20;// 修改p所指向的整数值即x的值指针的算术运算intarr[5]{1,2,3,4,5};int*ptrarr;// ptr指向数组的首地址inti0;for(i0;i5;i){printf(%d ,*(ptri));// 输出数组元素的值}动态内存分配int*pmalloc(sizeof(int));// 分配一个整数的内存空间返回指向该空间的指针pif(p!NULL){*p20;// 在该内存空间中存储整数值20printf(%d\n,*p);// 输出20free(p);// 释放内存空间}通过指针可以灵活操作内存和实现复杂的数据结构但是注意指针使用可能会导致内存泄漏、野指针等问题需谨慎处理。

相关新闻