嵌入式开发学习日志(c语言预处理及指针入门) day12 持续更新中
一、GCC 编译的四个完整步骤我们在终端输入一条gcc main.c -o a.out命令时背后其实经历了 4 个独立的阶段。理解这个过程对排查编译错误如之前的stray \357编码错误非常有帮助。阶段指令参数输入文件输出文件主要工作1. 预处理-E.c.i展开头文件#include、宏替换#define、处理条件编译2. 编译-S.i.s将 C 代码翻译为汇编指令3. 汇编-c.s.o将汇编指令转为二进制机器码4. 链接(无).o可执行文件链接系统库函数合并目标文件实操顺序.c→.i→.s→.o→可执行程序二、预处理命令预处理在编译之前执行本质是文本替换不进行语法运算。1. 宏定义#define(1) 无参宏符号常量#define PI 3.1415(2) 带参宏宏函数#define ADD(a,b) ((a)(b)) #define MAX(a,b) ((a)(b)?(a):(b)) #define AREA(r) ((PI)*(r)*(r))✅ 宏书写重要规范文本替换宏仅仅是文本替换运行前展开。括号保护表达式参数全部加括号防止运算符优先级出错。命名规范宏标识符建议大写宏末尾不要加分号。 宏 VS 普通函数宏预处理阶段替换代码副本增多程序体积变大无函数调用开销。函数运行时调用需要保护/恢复现场存在调用开销。2. 头文件包含#include#include stdio.h尖括号。系统头文件编译器去系统路径如/usr/include查找。#include head.h双引号。自定义头文件优先在当前项目目录查找。头文件内一般存放其他头文件、类型声明、宏定义、函数声明、全局变量声明。3. 条件编译根据宏是否定义、表达式真假选择性编译部分代码。#if 表达式 ... #endif表达式为真则编译。常用于#if 0注释大块代码。#ifdef 宏名如果宏已定义编译对应代码常用于调试信息输出。#ifndef 宏名如果没有定义该宏则编译代码。最经典用途头文件防止重复包含。#ifndef __HEAD_H__ #define __HEAD_H__ // 头文件内容 #endif三、指针1. 基础概念内存程序运行可用存储空间以字节为单位编号。地址内存字节的编号。指针即内存地址。指针变量专门用来存放地址的变量。2. 指针变量定义与大小格式基类型 *指针名;int *pint; char *pch;基类型代表指针指向空间的数据类型。*标识该变量是指针。指针大小64 位系统所有指针占用8 字节32 位系统指针占用4 字节。3. 初始化与野指针int num 100; int *p NULL; // 1. 初始化为空指针推荐 int *p num; // 2. 定义同时赋值 p num; // 3. 赋值让指针指向 num⚠️ 野指针未初始化、或者指向已经释放内存的指针。规避方案指针初始化为NULL或赋值合法变量地址。4. 两个核心运算符运算符名称作用示例取地址获取变量首字节地址p num;(修改指针指向)*解引用访问指针指向内存中的数据*p 666;(修改指向空间的值)极易混淆区分p num;→ 修改指针本身让指针指向 num。*p num;→ 修改指针指向空间的数据指针指向不变。5. 指针算术运算允许运算、-、、--。*、/、%对指针无意义。指针 ± 整数向前/向后偏移若干个元素不是字节char *pc; pc1;// 向后偏移 1 字节int *pi; pi1;// 向后偏移 4 字节 (假设 int 为 4 字节)指针 - 指针前提同类型、指向同一块连续内存数组。结果两个地址之间相隔的元素个数。公式(地址差值) / sizeof(基类型)比较大小指针可以使用 !比较。6. 指针作函数参数修改变量值想要在函数内修改主函数变量的值必须传递变量地址指针传递。仅读取可以传值也可以传地址。多返回值使用指针参数带回结果。四、指针与一维数组数组名a等价于a[0]代表数组首元素地址。数组名是地址常量不能赋值如a xxx;非法。下标与指针等价a[0]*aa[1]*(a1)a[n]*(an)函数形参void print_array(int a[], int len); // 写法1 void print_array(int *pa, int len); // 写法2 (本质相同)数组传参本质是传递数组首元素地址退化为指针。五、易错点汇总宏末尾不要加分号带参宏所有参数必须包裹括号。头文件#ifndef用于防止重复包含。赋值pnum改指向和*pnum改值含义完全不同。指针减法两个指针相减得到的是元素个数不是字节差值。偏移量指针运算偏移单位由基类型决定。数组名是常量不能被赋值。崩溃原因使用未初始化指针野指针会导致程序崩溃。

相关新闻

平板坡口机支持哪些坡口形式?V型、U型、J型一次揭秘!

平板坡口机支持哪些坡口形式?V型、U型、J型一次揭秘!

在工业制造领域,从事金属加工、焊接工程等工作的工程师、技术人员和企业主们,在平板坡口机选型上常常踩坑。不少人花费大量资金购买了坡口机,却发现加工效率低下,无法满足生产需求;或者加工精度不达标,导致…

2026/10/27 0:37:11 阅读更多 →
Spring Boot 3 REST API 工程化实践:校验、异常、日志与测试

Spring Boot 3 REST API 工程化实践:校验、异常、日志与测试

写出一个能返回 JSON 的接口并不难,难的是让几十个接口长期保持一致:参数错误要容易定位,业务异常不能泄露堆栈,日志能够串起一次请求,重构后还要有测试兜底。本文以 Java 17、Spring Boot 3.x 为基础,搭建…

2026/10/24 3:33:26 阅读更多 →
SpringBoot+Vue图书商城系统开发实践

SpringBoot+Vue图书商城系统开发实践

1. 项目概述这个图书商城管理系统是我去年为一个高校图书馆开发的线上借阅平台,采用前后端分离架构,后端基于SpringBootMyBatisMySQL技术栈,前端使用Vue.js框架。系统上线后日均访问量稳定在3000,成功替代了原有的手工登记模式。提…

2026/10/25 13:29:18 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/26 12:00:21 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/27 7:21:53 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/26 12:00:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/27 6:20:47 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 13:55:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 7:21:50 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 8:34:37 阅读更多 →