与STM32相关的嵌⼊式C语言基础

本文介绍了C语言中的基本概念,包括二进制、十六进制的表示,位运算的使用,静态变量的特性,以及static修饰符在变量和函数上的应用。此外,还讲解了Typedef的作用,结构体指针的使用,const关键字的功能,以及共同体、宏定义和条件编译的概念。最后提到了大小端问题和数据结构的重要性。
摘要由CSDN通过智能技术生成

目录

一:⼆进制、⼗六进制、位运算

进制

位运算

 二:静态变量以及函数static

 三:Typedef及Typedef结构体

四:结构体指针

五:其他

const关键字:

共同体:

 宏定义、条件编译:

 ⼤⼩端:

数据结构


一:⼆进制、⼗六进制、位运算

进制

前缀组成
二进制0b(B) 0 和 1 两个数字组成
八进制0(数字) 0~7 八个数字组成
十进制无前缀 0~9 十个数字组成
十六进制0x(X)数字 0~9、字母 A~F 或 a~f(不区分大小写)组成

输出:

注意:

1.标准的C语言并不支持上面的二进制写法

2.部分编译器支持二进制数字的表示,但是却不能使用 printf 函数输出二进制。当然,通过转换函数可以将其它进制数字转换成二进制数字,并以字符串的形式存储,然后在 printf 函数中使用%s输出即可。

 位运算

位运算(&、|、^、~、>>、 | 菜鸟教程 (runoob.com)

 位运算符与赋值运算符结合,组成新的复合赋值运算符

 二:静态变量以及函数static

C/C++ 中 static 的用法全局变量与局部变量 | 菜鸟教程 (runoob.com)

修饰变量:static 修饰的静态局部变量只执行初始化一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。

修饰全局变量:这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是 extern 外部声明也不可以。

修饰函数:static 修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用(利用这一特性,可以在不同文件夹中定义同名变量或者函数,而不必担心命名冲突)

 三:Typedef及Typedef结构体

typedef 用于为现有类型创建一个新的名字,或称为类型别名,用来简化变量
的定义。typedef 在MDK 用得最多的就是定义结构体的类型别名和枚举类型了

用途一:定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。

用途二:用typedef来定义与平台无关的类型。

用途三:为复杂的声明定义一个新的简单的别名。方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。

C typedef | 菜鸟教程 (runoob.com)

C/C++结构体typedef用法详解(附c系统学习资料) - 知乎 (zhihu.com)

//如:
typedef struct
{
u16 seq_num;
u16 len;
u8 dev_id[GPRS_PRO_DEVICE_ID];
u16 command_id;
u8 *pro_data;
}gprs_pro_cmd_t;
//然后我们就可以直接使用gprs_pro_cmd_t 定义一个结构体变量。

 typedef vs #define

#define 是 C 指令,用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同:

  • typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。
  • typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。

四:结构体指针

  • 结构体变量.成员名。
  • (*指针变量).成员名。
  • 指针变量->成员名。

结构体指针,C语言结构体指针详解 (biancheng.net)

用指针引用结构体变量成员的方式是:

(*指针变量名).成员名

# include <stdio.h>
# include <string.h>
struct AGE
{
    int year;
    int month;
    int day;
};
struct STUDENT
{
    char name[20];  //姓名
    int num;  //学号
    struct AGE birthday;  //生日
    float score;  //分数
};
int main(void)
{
    struct STUDENT student1; /*用struct STUDENT结构体类型定义结构体变量student1*/
    struct STUDENT *p = NULL;  /*定义一个指向struct STUDENT结构体类型的指针变量p*/
    p = &student1;  /*p指向结构体变量student1的首地址, 即第一个成员的地址*/
    strcpy((*p).name, "小明");  //(*p).name等价于student1.name
    (*p).birthday.year = 1989;
    (*p).birthday.month = 3;
    (*p).birthday.day = 29;
    (*p).num = 1207041;
    (*p).score = 100;
    printf("name : %s\n", (*p).name);  //(*p).name不能写成p
    printf("birthday : %d-%d-%d\n", (*p).birthday.year, (*p).birthday.month, (*p).birthday.day);
    printf("num : %d\n", (*p).num);
    printf("score : %.1f\n", (*p).score);
    return 0;
}

//输出结果
//name : 小明
//birthday : 1989-3-29
//num : 1207041
//score : 100.0

为了使用的方便和直观,用指针引用结构体变量成员的方式:

(*指针变量名).成员名

可以直接用:

指针变量名->成员名

来代替,它们是等价的。“->”是“指向结构体成员运算符”,它的优先级同结构体成员运算符“.”一样高。p->num 的含义是:指针变量 p 所指向的结构体变量中的 num 成员。p->num 最终代表的就是 num 这个成员中的内容。

# include <stdio.h>
# include <string.h>
struct AGE
{
    int year;
    int month;
    int day;
};
struct STUDENT
{
    char name[20];  //姓名
    int num;  //学号
    struct AGE birthday;  /*用struct AGE结构体类型定义结构体变量birthday, 生日*/
    float score;  //分数
};
int main(void)
{
    struct STUDENT student1; /*用struct STUDENT结构体类型定义结构体变量student1*/
    struct STUDENT *p = NULL;  /*定义struct STUDENT结构体类型的指针变量p*/
    p = &student1;  /*p指向结构体变量student1的首地址, 即第一项的地址*/
    strcpy(p->name, "小明");
    p->birthday.year = 1989;
    p->birthday.month = 3;
    p->birthday.day = 29;
    p->num = 1207041;
    p->score = 100;
    printf("name : %s\n", p->name);  //p->name不能写成p
    printf("birthday : %d-%d-%d\n", p->birthday.year, p->birthday.month, p->birthday.day);
    printf("num : %d\n", p->num);
    printf("score : %.1f\n", p->score);
    return 0;
}

五:其他

const关键字:

不能再次赋值只能使用,保证其定义的值不变

C++ const 关键字小结 | 菜鸟教程 (runoob.com)

共同体:

 C 共用体 | 菜鸟教程 (runoob.com)

 宏定义、条件编译:

(12条消息) C语言详解(6)宏定义和条件编译_宏定义需要编译吗_「已注销」的博客-CSDN博客

 ⼤⼩端:

(12条消息) 什么是大小端?如何确定大小端?_wwwlyj123321的博客-CSDN博客

(12条消息) 字节序(大小端)理解_字节大小端_della_Xiang的博客-CSDN博客 

数据结构:

[整理] 浅谈堆、栈、堆区、栈区的概念和区别 - 哆啦梦乐园 - 博客园 (cnblogs.com) 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值