尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
嵌入式开发学习日志(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改值含义完全不同。指针减法两个指针相减得到的是元素个数不是字节差值。偏移量指针运算偏移单位由基类型决定。数组名是常量不能被赋值。崩溃原因使用未初始化指针野指针会导致程序崩溃。
RELATED

相关推荐

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

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

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

📅 2026/9/9 1:35:46
Spring Boot 3 REST API 工程化实践:校验、异常、日志与测试

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

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

📅 2026/10/4 4:55:14
SpringBoot+Vue图书商城系统开发实践

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

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

📅 2026/10/11 18:59:31
MORE NEWS

更多资讯

📰

ArcGIS插件RAR包从安装到排错:识别形态、部署与打包全流程

简介:这是一份ArcGIS专业插件合集,面向从事地理数据处理、空间分析与农业土地管理的GIS工程师、规划人员及高校相关专业学生。压缩包内含按面积分割、锐角检查、谷脊分析、模型数据及农经权节点过密处理等五类实用工具。其中,按面积分割可自定…

📰

金字塔原理:让表达清晰有结构的思维工具

你发现没有,同样一件事,有人三句话就能讲清楚,有人绕了十分钟,听众还是一脸茫然。这不是口才的差距,而是思维方式的问题。我在工作和写作中反复打磨过表达能力,最后发现,几乎所有高效沟通的背后…

📰

Python魔术方法__gt__:深入理解大于比较运算符与富比较协议

在 Python 的魔法方法——也就是常说的魔术方法、双下方法——这个系列里,__gt__属于看着简单、用起来却最能暴露“对运算符协议理解深浅”的那一类。名字拆开一点也不难:gt 是 greater than 的缩写,对应表达式就是a > b,方法定…

📰

Scrapy+BeautifulSoup组合实战:从零构建稳定网页抓取系统

做网页数据抓取这一年多,我打交道最多的两个工具就是 BeautifulSoup 和 Scrapy。很多人觉得 BeautifulSoup 只是入门级解析库,Scrapy 又太复杂不敢碰,但把两者放在一起用,你会发现比单独用其中任何一个都顺手。这个组合适合三类人…

📰

Spring Boot在线房屋出租系统毕设实战:从设计到部署全解析

做毕设选方向时,我最后定在了基于Spring Boot的在线房屋出租系统。这个题目看起来常见,但房屋出租天然包含用户、房源、订单、预约几条核心业务线,既能覆盖常规的增删改查,又能往权限控制、状态流转、文件上传、条件检索这些方向做…

📰

dsh-skill-mcp-panel 排查三连:命令、MCP连接、面板缺失

1. 项目概述:这不是面板丢了,是技能链断了“面板不见了、MCP 连不上、命令找不到”——这三句话不是故障现象的罗列,而是技能执行链上三个关键节点同时失联的明确信号。我第一次在某跨平台自动化项目中看到这个报错组合时,下意识去…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬