嵌入式开发之C语言入门:从基础到核心语法
前言作为一名想要深耕嵌入式软件开发方向的学习者在掌握Linux基础命令行操作后C语言成为了我下一步核心的学习内容。之所以将C语言作为嵌入式开发的入门核心语言核心原因在于C语言的特性完美契合了嵌入式开发的底层需求它支持直接的底层硬件操作能访问内存地址、操作寄存器适配嵌入式设备的硬件控制场景同时C语言代码执行效率高、生成的可执行文件体积小符合嵌入式设备资源受限的特点加之Linux系统本身基于C语言开发标准C的跨平台特性让基于Linux的嵌入式开发具备天然的兼容性且C语言的结构化编程特性也让嵌入式程序的模块化、可维护性大幅提升。可以说C语言是嵌入式开发的基础语言和核心工具掌握它才能真正走进嵌入式开发的底层世界。接下来将结合C语言的学习笔记从C语言概述、程序开发流程、基础语法、数据类型、常量与变量等核心知识点入手做一次系统的入门总结为后续嵌入式开发的学习打下坚实基础。一、C语言基础概述1. 计算机基础认知计算机由硬件和软件组成硬件是物理部件CPU、内存、硬盘、单片机、嵌入式系统等软件分为系统软件OS、应用软件、编程工具编译器核心由六大部件构成各部件分工明确CPU控制指令执行和数据计算内存临时存储程序运行的指令和数据输入/输出设备实现数据的输入与处理结果的输出外存永久存储数据网络实现设备间数据传输。计算机的核心工作原理为存储程序程序控制即程序和数据预先存入内存CPU按指令顺序逐条执行。2. 计算机语言分类从底层到高层计算机语言分为三类C语言属于高级语言兼具高层语言的可读性和底层语言的操作能力机器语言二进制代码直接控制硬件执行效率最高汇编语言用助记符表示机器指令需汇编器翻译为机器语言高级语言贴近人类自然语言可读性强需编译/解释执行C/C、Java等。3. C语言的起源与标准C语言诞生于美国贝尔实验室其前身是B语言由Ken Thompson开发并用于编写初版UNIX1972年Dennis M. RitchieC语言之父在B语言基础上开发出C语言并在1973年用C语言重写了UNIX系统。为推动C语言规范化各类标准相继推出核心标准如下C89ANSI C1989年ANSI发布的首个完整C语言标准C901990年ISO一字不改采纳C89并命名C99/C11/C18对标准的修订、完善与漏洞修复C232023扩展模块、协程支持等功能做了性能优化。GNU C是GCC编译器对标准C的扩展语法并非独立标准。4. C语言的核心特点C语言能成为嵌入式、系统开发的主流语言源于其独有的特性简洁高效支持底层硬件操作直接访问内存地址、操作寄存器可移植性强符合标准的C程序可在Windows、Linux、嵌入式设备间轻松移植适合结构化编程代码模块化程度高易维护、易调试生成代码质量高执行速度快接近汇编语言。二、C语言程序开发与编译流程1. 开发三大核心步骤C语言程序开发分为编辑、编译、运行三步是从代码编写到最终执行的基础流程编辑程序员编写源程序生成.c格式的源文件编译编译器将源代码转换为可执行的二进制指令文件运行操作系统加载并执行可执行二进制程序验证运行结果。2. 编译的四阶段细节日常所说的“编译”实际包含四个阶段需依次经过预处理器、编译器、汇编器、链接器处理最终生成可执行文件以hello.c为例的处理流程hello.c→ 预处理 →hello.i→ 编译 →hello.s→ 汇编 →hello.o→ 链接 → 可执行文件。各阶段的核心工作与GCC编译命令如下编译步骤GCC命令文件类型转换核心工作预处理gcc -E *.c -o *.i*.c→*.i处理宏定义#define、头文件包含#include移除注释将头文件内容拷贝到当前文件编译gcc -S *.c -o *.s*.i/*.c→*.s对预处理代码做语法分析、语义检查生成汇编语言代码汇编gcc -c *.c -o *.o*.s→*.o将汇编代码转换为二进制代码生成二进制目标文件链接gcc *.c -o **.o→ 可执行文件将目标文件与系统库文件、其他目标文件合并生成可执行二进制文件三、C语言程序的基本结构与编程规范1. 程序基本结构C语言程序的核心是函数且有且仅有一个main函数程序执行的唯一入口一个基础的C程序包含注释、预处理指令、主函数、函数体、函数调用语句等部分以下是经典的hello world示例#includestdio.h// 预处理指令引入输入输出标准库使用printf/scanf// 主函数程序入口有且仅有一个intmain(intargc,char*argv[]){printf(hello world!\n);// 函数调用语句控制台输出内容\n为换行符return0;// 函数返回值0表示程序正常结束}核心结构说明注释用于解释代码逻辑预处理阶段会被删除不参与编译预处理指令以#开头通常放在程序最前面用于头文件包含、宏定义等主函数main由操作系统自动调用不能被自定义函数调用函数头说明返回值类型、函数名、参数列表函数体用{}括起内部是执行语句以;结尾函数调用可调用C标准库函数如printf或自定义函数。2. 通用编程规范良好的编程规范能提升代码的可读性和可维护性是嵌入式开发中团队协作的基础核心规范要求如下缩进格式推荐缩进4个字符一个Tab键统一代码层级注释要求关键代码函数功能、复杂逻辑、变量含义添加注释单行用//多行用/* */空行分隔预处理指令与函数、函数与函数、全局变量与函数之间添加空行区分代码模块{}对齐C/C风格要求{和}独占一行避免Java风格单句单行不将多条语句写在同一行for(;;)除外标识符命名函数名、变量名等标识符见名知意用英文单词/短语避免无意义字母如age表示年龄而非a分层模块化函数体内代码按逻辑层级缩进复杂逻辑拆分为模块化代码。四、C语言的注释体系C语言的注释不参与编译核心作用是解释代码、屏蔽临时无用代码分为单行注释、多行注释并衍生出标准化的文档注释用于生成程序文档。单行注释以//开头注释范围到行尾适用于变量说明、简单逻辑、函数调用语句注释多行注释以/*开头、*/结尾可单行/跨多行不能嵌套适用于文件头说明、函数功能说明、复杂代码块注释文档注释由多行注释衍生格式规范包含file、author、brief、param、return等标签适用于生成标准化的程序文档常用于文件、函数、结构体、宏定义的注释。五、数据类型固定大小内存的别名数据类型是C语言的基础本质是固定大小内存的别名核心作用是描述变量存储的数据类型、明确运算规则、优化内存使用按需分配空间。程序运行时所有数据都需加载到内存数据类型决定了数据在内存中如何存储、需要多大空间。1. 数据类型分类C语言数据类型分为四大类基本类型是入门阶段的核心构造类型、指针类型为后续进阶内容基本类型内置类型整型、浮点型、字符型、布尔型C99新增由系统直接定义可直接使用构造类型结构体struct、联合体union、枚举enum由用户基于基本类型自定义指针类型用于存储内存地址是C语言的核心特性也是嵌入式开发的重点空类型void表示无类型用于函数返回值、函数形参、指针类型。2. 基本类型的内存大小与取值范围基本类型的内存大小字节与操作系统、编译系统32/64位相关64位系统下的核心基本类型参数如下1字节8位数据类型中文说明占用字节常见取值范围short短整型2-32768 ~ 32767int基本整型4-2147483648 ~ 2147483647long长整型8-9223372036854775808 ~ 9223372036854775807long long长长整型8-9223372036854775808 ~ 9223372036854775807float单精度浮点型4约±3.4×10³⁸精度6~7位有效数字double双精度浮点型8约±1.7×10³⁰⁸精度15~16位有效数字char字符型1-128~127有符号/ 0~255无符号bool布尔型1true非0/ false03. 字节数获取sizeof运算符获取数据类型/变量的占用字节数使用**sizeof运算符**非函数计算结果为无符号整数语法有两种sizeof(数据类型);// 如sizeof(int)、sizeof(bool)sizeof(变量名);// 如sizeof(age)、sizeof(f)注意使用bool类型需包含头文件stdbool.h兼容旧编译器时可直接用int的0和1表示false和true。六、常量程序运行中值不可改变的量常量是程序执行过程中值不可改变的量与变量一样占用内存空间按数据类型可分为整型常量、浮点型常量、字符型常量、字符串常量、符号常量宏定义核心用于表示程序中固定不变的数值如圆周率π、数组最大长度。1. 各类常量的表示规则1整型常量有十进制、八进制、十六进制三种表示形式无小数可通过后缀L/l指定为长整型十进制0~9组成不能以0开头0自身除外如99、0、218八进制0~7组成以0为前缀如023、077十六进制09af/A~F组成以0x/0X为前缀如0x123、0XFFFFFF。2浮点型常量表示小数/实数有十进制小数、指数科学计数法两种形式默认是double类型加F/f可指定为float类型十进制小数必须包含小数点.如0.123、3.0、-12.6、0.123F指数形式格式为数字 e/E 整数指数e/E前必须有数字后必须是整数如1.2e-2、1.2345e3F。3字符型常量分为普通字符常量和转义字符常量用单引号’括起本质存储的是字符对应的ASCII码值普通字符常量单引号内仅一个字符英文/数字/符号如’a’、‘5’、‘’转义字符常量以\开头的特殊字符序列用于表示控制字符/不可见字符核心如\n换行、\t制表符、\0空字符字符串结束标志、\\反斜杠等。4字符串常量用双引号括起的字符序列C语言无内置字符串类型需通过字符数组/字符指针实现末尾会自动添加\0作为结束标志不可见、不输出如hello实际存储为hello\0空字符串实际存储为\0。字符常量与字符串常量的核心区别对比项字符常量如’a’字符串常量如a定界符单引号’’双引号内存占用1字节ASCII码2字节‘a’‘\0’结束标志无自动添加\0表示范围仅单个字符多个字符/空5符号常量无参宏定义通过预处理指令#define定义的标识符预处理阶段会直接用宏值替换宏名称核心优点是增强代码可读性、提升可维护性修改时仅改宏定义即可。语法#define 宏名称 宏值行末不能加分号宏名称与宏值用空格隔开示例#define PI 3.1415926、#define MAX_LEN 1002. 有符号与无符号常量常量默认有符号可表示负数、0、正数可通过unsigned修饰为无符号仅表示0、正数正数范围更大有符号如char的取值范围-128~127可加signed修饰通常省略无符号如unsigned char的取值范围0~255内存中无符号位负数位用于存储正数。七、变量程序运行中值可改变的量变量是程序运行过程中值可改变的量对应内存中具有特定属性的存储单元用于存放可变数据变量必须有唯一名称通过变量名可访问对应的内存单元变量名本质是固定大小内存的别名。1. 变量的定义与使用变量定义的核心是指定数据类型编译器会根据数据类型分配对应大小的内存空间语法与使用方式主要有四种#includestdio.hintmain(intargc,char*argv[]){// 1. 声明并初始化推荐避免随机值intage21;// 2. 先声明后赋值intcount;count10;// 3. 初始化后重新赋值新值覆盖旧值intnumber12;number22;// 4. 同一类型定义多个变量逗号分隔仅初始化部分变量inta,b10,c;return0;}核心注意局部变量函数内定义未初始化时内存中是随机值访问未初始化变量属于“未定义行为”运行结果不可预测C语言要求变量先定义后使用未定义直接使用会编译报错赋值运算符的执行顺序是自右向左即将右侧值赋给左侧变量。2. 变量的命名规则变量名是标识符的一种命名需遵循C语言标识符的通用规则同时推荐遵循命名约定保证代码可读性1强制规则以字母(a~z/ A~Z)或下划线_开头仅包含字母、数字、下划线不能包含其他字符不能与C语言关键字如int、if、float、系统预定义标识符如printf、scanf重名大小写敏感如num和Num是两个不同变量。2推荐约定变量名、函数名采用C风格小写字母下划线如set_count或Java风格小驼峰如setCount见名知意常量名、枚举名大写字母下划线如MAX_VALUE、PI。3. 隐式类型转换C语言中定义变量时若赋值的常量类型与变量类型不一致编译器会自动进行隐式类型转换低字节类型向高字节类型转换避免数据丢失如longb12;// int类型常量12自动转换为long类型intb(short)12;// short类型常量12自动转换为int类型整型变量的存储范围由所占字节数和符号属性共同决定如char1字节有符号范围-128~127unsigned char1字节无符号范围0~255。八、标识符的整体认知标识符是用来表示程序中对象名称的有效字符序列对象包括变量、常量、函数、数组、构造类型等简单来说标识符就是程序中各类对象的名字。1. 标识符的构成规则仅由字母、数字、下划线三种字符构成必须以字母或下划线开头如num2、_set合法2num非法大小写敏感长度无强制限制由编译器决定。2. 标识符的分类关键字共32个系统赋予特定含义和用途不可用作自定义标识符如int、char、if、for、struct等系统预定义标识符系统提供的标识符如标准库函数名printf、scanf、预处理指令include、define等可重定义但不推荐用户标识符用户自定义的标识符用于给变量、自定义函数、符号常量、数组等命名需遵循命名规则和约定。3. C语言常用预处理指令预处理指令以#开头共12个入门阶段核心使用#include头文件包含、#define宏定义其余如#if、#ifdef、#endif等为条件编译指令后续进阶学习。核心预处理指令#define、#include、#if、#else、#elif、#endif、#ifdef、#ifndef、#error、#line、#pragma、#undef。以上就是整理的 C 语言刚刚学习到的核心知识点主要围绕 C 语言基础概述、开发编译流程、基本语法结构、数据类型、常量与变量、标识符等入门必备内容展开也是后续深入学习 C 语言的基础。后续我会继续 C 语言的后续内容预计3周时间更新完成比如运算符、分支与循环语句、数组、指针、结构体等嵌入式开发的核心知识点一周至少更新2次边学边总结慢慢补充完善相关内容也希望和各位嵌入式开发学习路上的小伙伴一起交流进步。

相关新闻

线程池学习2

线程池学习2

项目地址&#xff1a;https://github.com/vit-vit/ctpl 辅助队列 namespace ctpl {namespace detail {template <typename T>class Queue {public:bool push(T const& value) {std::unique_lock<std::mutex> lock(this->mutex); //def名为lock的std::uniqu…

2026/5/17 11:53:01 阅读更多 →
基于Java springboot海洋馆预约系统(源码+文档+运行视频+讲解视频)

基于Java springboot海洋馆预约系统(源码+文档+运行视频+讲解视频)

文章目录 系列文章目录目的前言一、详细视频演示二、项目部分实现截图三、技术栈 后端框架springboot前端框架vue持久层框架MyBaitsPlus系统测试 四、代码参考 源码获取 目的 海洋馆预约系统利用Java Spring Boot框架&#xff0c;实现了游客预约、门票销售、场馆导览及用户反…

2026/5/17 11:53:00 阅读更多 →
# Openssl关键知识

# Openssl关键知识

Openssl关键知识 文章目录Openssl关键知识1 常用命令2 证书扩展段&#xff08;Extensions Section&#xff09;3 常用证书类型openssl及证书相关知识一般好像很简单&#xff0c;其实很复杂&#xff0c;这里介绍一些相对关键的部分&#xff0c;以后还会扩展。更多openssl及ca知识…

2026/7/3 10:42:50 阅读更多 →

最新新闻

微信聊天记录永久保存的终极解决方案:WeChatMsg完整数据留痕指南

微信聊天记录永久保存的终极解决方案:WeChatMsg完整数据留痕指南

微信聊天记录永久保存的终极解决方案&#xff1a;WeChatMsg完整数据留痕指南 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trendin…

2026/7/4 6:08:42 阅读更多 →
tchMaterial-parser:3步掌握智慧教育平台电子课本免费下载终极方案

tchMaterial-parser:3步掌握智慧教育平台电子课本免费下载终极方案

tchMaterial-parser&#xff1a;3步掌握智慧教育平台电子课本免费下载终极方案 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具&#xff0c;帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载&#xff0c;让您更方便地获取课本内容。…

2026/7/4 6:06:42 阅读更多 →
GPT-4o与GPT-4核心差异:架构、延迟、多模态与成本实战对比

GPT-4o与GPT-4核心差异:架构、延迟、多模态与成本实战对比

1. 这不是参数表对比&#xff0c;而是真实场景下的能力分水岭“GPT-4o和GPT-4有什么区别&#xff1f;”——这个问题我每天在技术社群、产品团队会议、甚至客户现场演示后都会被问到至少三遍。但绝大多数人点开的所谓“对比文章”&#xff0c;只是把官网参数截图拼在一起&#…

2026/7/4 6:04:42 阅读更多 →
KlakSpout完全指南:如何在Unity中实现零延迟跨应用视频流共享

KlakSpout完全指南:如何在Unity中实现零延迟跨应用视频流共享

KlakSpout完全指南&#xff1a;如何在Unity中实现零延迟跨应用视频流共享 【免费下载链接】KlakSpout Spout plugin for Unity 项目地址: https://gitcode.com/gh_mirrors/kl/KlakSpout 想要在Unity中实现零延迟的视频流共享吗&#xff1f;KlakSpout正是您需要的终极解决…

2026/7/4 5:58:40 阅读更多 →
Tidy.js:JavaScript数据清洗革命!用dplyr思维轻松处理数组数据

Tidy.js:JavaScript数据清洗革命!用dplyr思维轻松处理数组数据

Tidy.js&#xff1a;JavaScript数据清洗革命&#xff01;用dplyr思维轻松处理数组数据 【免费下载链接】tidy Tidy up your data with JavaScript, inspired by dplyr and the tidyverse 项目地址: https://gitcode.com/gh_mirrors/ti/tidy 还在为JavaScript中复杂的数据…

2026/7/4 5:56:40 阅读更多 →
Mongood核心功能全解析:从数据编辑到慢查询分析的完整指南

Mongood核心功能全解析:从数据编辑到慢查询分析的完整指南

Mongood核心功能全解析&#xff1a;从数据编辑到慢查询分析的完整指南 【免费下载链接】mongood A MongoDB GUI with Fluent Design 项目地址: https://gitcode.com/gh_mirrors/mo/mongood Mongood是一款采用Fluent Design设计的MongoDB GUI工具&#xff0c;为数据库管理…

2026/7/4 5:56:40 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布&#xff0c;这是一个关键的安全修复版本&#xff0c;修复了多个方面的问题&#xff0c;还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出&#xff0c;mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南&#xff1a;使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL&#xff08;Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器&#xff0c;与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻