嵌入式学习第十一天:深入理解C语言指针
学习目标今天是嵌入式学习的第十一天我们深入探讨了C语言中最重要的概念之一——指针。指针是C语言的精髓也是嵌入式开发中直接操作硬件、管理内存的核心工具。 核心知识点总结1. 指针的基本概念1.1 地址与指针地址内存中每个字节都有一个唯一的编号称为地址指针存储地址的变量指向内存中的某个位置指针变量专门用来存放地址的变量intnum100;// 定义一个整型变量int*pnum;// 定义指针变量p指向num的地址1.2 指针的两个关键运算符取地址运算符获取变量的内存地址*取值运算符获取指针指向的内存内容inta10;int*ptra;// ptr保存a的地址printf(a的值%d\n,a);// 输出10printf(a的地址%p\n,a);// 输出a的地址printf(ptr指向的值%d\n,*ptr);// 输出102. 指针变量的定义与使用2.1 指针变量的定义格式数据类型*指针变量名;// 示例int*p_int;// 指向int类型的指针char*p_char;// 指向char类型的指针float*p_float;// 指向float类型的指针double*p_double;// 指向double类型的指针2.2 重要特性所有指针变量在64位系统中都占8个字节指针类型决定了指针运算时移动的步长指针必须初始化后才能使用避免野指针3. 指针的初始化与注意事项3.1 正确的初始化方式intnum100;int*p1num;// 正确指向已存在变量的地址int*p2NULL;// 正确初始化为空指针3.2 需要避免的情况int*p1;// 错误未初始化野指针*p1100;// 危险操作未知内存int*p20x123456;// 错误直接赋地址值除非是硬件寄存器地址4. 指针的算术运算4.1 指针的加减运算intarr[5]{10,20,30,40,50};int*parr;// p指向arr[0]printf(%d\n,*p);// 输出10p;// p指向arr[1]printf(%d\n,*p);//输出20p2;// p指向arr[3]printf(%d\n,*p);// 输出404.2 指针运算的规则p n向高地址移动 n * sizeof(数据类型) 字节p - n向低地址移动 n * sizeof(数据类型) 字节两个指针相减得到它们之间相差的元素个数5. 指针与数组的关系5.1 数组名就是指针常量intarr[5]{1,2,3,4,5};// 以下四种访问方式等价arr[2]100;*(arr2)100;int*parr;p[2]100;*(p2)100;5.2 数组传参的本质// 函数声明三种等价形式voidfunc1(intarr[],intlen);voidfunc2(intarr[10],intlen);voidfunc3(int*arr,intlen);// 函数调用intmain(){intarray[10]{0};func1(array,10);// 传递的是数组首地址return0;}6. 指针作为函数参数6.1 值传递 vs 地址传递// 值传递无法修改实参voidswap_value(inta,intb){inttempa;ab;btemp;}// 地址传递可以修改实参voidswap_pointer(int*a,int*b){inttemp*a;*a*b;*btemp;}intmain(){intx10,y20;swap_value(x,y);// x,y的值不变swap_pointer(x,y);// x,y的值交换return0;}6.2 通过指针返回多个值voidget_min_max(intarr[],intlen,int*min,int*max){*minarr[0];*maxarr[0];for(inti1;ilen;i){if(arr[i]*min)*minarr[i];if(arr[i]*max)*maxarr[i];}}intmain(){intnums[5]{3,1,4,1,5};intmin_val,max_val;get_min_max(nums,5,min_val,max_val);printf(最小值%d最大值%d\n,min_val,max_val);return0;}7. 指针的常见应用场景7.1 动态内存管理后续学习// malloc动态分配内存int*p(int*)malloc(10*sizeof(int));if(p!NULL){// 使用分配的内存free(p);// 使用完毕后释放}7.2 字符串操作charstr[]Hello;char*pstr;while(*p!\0){printf(%c,*p);p;}7.3 函数指针后续学习intadd(inta,intb){returnab;}intsub(inta,intb){returna-b;}intmain(){int(*func_ptr)(int,int);// 函数指针声明func_ptradd;printf(53%d\n,func_ptr(5,3));func_ptrsub;printf(5-3%d\n,func_ptr(5,3));return0;} 重点难点解析1. 指针的类型重要性intnum0x12345678;char*p_char(char*)#int*p_int#printf(通过char指针0x%x\n,*p_char);// 输出0x78小端序printf(通过int指针0x%x\n,*p_int);// 输出0x123456782. 指针的const修饰constint*p1;// 指向常量的指针不能通过p1修改指向的值int*constp2;// 常量指针p2的指向不能改变constint*constp3;// 指向常量的常量指针既不能改值也不能改指向3. 多级指针intnum100;int*pnum;// 一级指针int**ppp;// 二级指针printf(num %d\n,num);// 100printf(*p %d\n,*p);// 100printf(**pp %d\n,**pp);// 100️ 实践练习练习1指针基础操作#includestdio.hintmain(){inta10,b20;int*p1a,*p2b;printf(交换前a%d, b%d\n,a,b);// 通过指针交换值inttemp*p1;*p1*p2;*p2temp;printf(交换后a%d, b%d\n,a,b);return0;}练习2指针与数组#includestdio.hvoidreverse_array(int*arr,intlen){int*startarr;int*endarrlen-1;while(startend){inttemp*start;*start*end;*endtemp;start;end--;}}intmain(){intnums[5]{1,2,3,4,5};printf(原数组);for(inti0;i5;i){printf(%d ,nums[i]);}reverse_array(nums,5);printf(\n反转后);for(inti0;i5;i){printf(%d ,nums[i]);}return0;} 常见错误与调试技巧1. 野指针问题// 错误示例int*p;// 未初始化野指针*p100;// 可能引发段错误// 正确做法int*pNULL;// 初始化为空指针if(p!NULL){// 使用前检查*p100;}2. 指针越界访问intarr[5]{0};int*parr;for(inti0;i5;i){// 错误i5时越界p[i]i*10;}3. 使用gdb调试指针# 编译时加入调试信息gcc-gprogram.c-oprogram# 启动gdbgdb ./program# 常用命令(gdb)breakmain# 在main函数设置断点(gdb)run# 运行程序(gdb)printvar# 打印变量地址(gdb)print *ptr# 打印指针指向的值(gdb)x/4x ptr# 以16进制查看ptr指向的4个字节 学习建议多画内存图理解指针时在纸上画出内存布局图循序渐进从一级指针开始逐步理解多级指针实践为主多写代码通过调试观察指针的变化理解本质指针就是地址所有操作都是对内存地址的操作安全第一始终检查指针是否为NULL避免野指针 明日预告明天我们将学习动态内存管理malloc/free结构体与指针链表的基本概念 总结指针是C语言中最强大也最容易出错的功能。今天的课程让我们理解了指针的本质、基本操作和常见应用。掌握指针需要时间和实践建议大家在理解概念的基础上多写代码、多调试逐步建立对内存操作的直观感受。记住指针就是地址操作指针就是操作内存。在嵌入式开发中这种直接操作内存的能力正是我们控制硬件的关键

相关新闻

C++开发,使用VLD工具检测程序中的内存泄露

C++开发,使用VLD工具检测程序中的内存泄露

内存泄露简介 对于C程序员来说,代码开发完成测试运行也OK后,并不代表这个程序就没有问题了。当你编译运行完程序后打开输出窗口有时就会看到,哇~怎么这么多一串一串的数据啊!!! 其实这种东西对于C程序员来…

2026/8/1 5:37:54 阅读更多 →
QQ+OpenClaw智能对话系统开发指南

QQ+OpenClaw智能对话系统开发指南

1. 项目概述:QQOpenClaw的AI助手组合方案在即时通讯工具中集成AI能力已成为当前的技术趋势。这个方案通过OpenClaw框架对接QQ平台,实现了一个可编程的智能对话系统。不同于传统的聊天机器人,这套系统具备以下核心特性:自然语言理解…

2026/8/1 5:37:54 阅读更多 →
Godot 4游戏集成Steamworks SDK:成就与云存档实战指南

Godot 4游戏集成Steamworks SDK:成就与云存档实战指南

1. 项目概述:从Godot到Steam的最后一公里如果你用Godot 4做完了一个游戏,看着它在编辑器里流畅运行,成就感满满,那么接下来最激动人心也最让人头疼的一步,就是把它送到玩家手里。Steam,作为全球最大的PC游戏…

2026/8/1 5:37:53 阅读更多 →

最新新闻

【AI远程办公效率跃迁指南】:20年IT架构师亲测的7大智能工具链与3个避坑红线

【AI远程办公效率跃迁指南】:20年IT架构师亲测的7大智能工具链与3个避坑红线

更多请点击: https://intelliparadigm.com 第一章:AI远程办公效率跃迁的认知重构 传统远程办公的效能瓶颈,往往并非源于工具缺失,而是根植于对“协作”与“自主”的认知错位——我们习惯将异步沟通等同于延迟响应,把自…

2026/8/1 6:15:05 阅读更多 →
AI水彩风格迁移失败率高达68%?2024最新评估框架揭示3个被低估的色彩空间陷阱(附可复现Benchmark数据集)

AI水彩风格迁移失败率高达68%?2024最新评估框架揭示3个被低估的色彩空间陷阱(附可复现Benchmark数据集)

更多请点击: https://kaifayun.com 第一章:AI生成水彩画效果 将普通照片转化为富有表现力的水彩画风格,已成为AI图像生成领域中兼具艺术性与实用性的典型应用。现代扩散模型(如Stable Diffusion)结合LoRA微调与Contro…

2026/8/1 6:15:05 阅读更多 →
音频指纹与元数据验证:识别50 Cent音乐真伪的技术指南

音频指纹与元数据验证:识别50 Cent音乐真伪的技术指南

如果你正在寻找 50 Cent 的最新音乐作品,或者对地下经典混音带感兴趣,那么这篇文章可能会让你失望——因为从技术角度来看,这个标题描述的内容存在明显的误导性。让我们先明确一个关键事实:50 Cent 作为主流说唱巨星,其…

2026/8/1 6:15:05 阅读更多 →
脏数据泛滥、报表不准?企业数据治理第一步:用好ETL工具

脏数据泛滥、报表不准?企业数据治理第一步:用好ETL工具

当下,绝大多数企业早已完成业务系统的全覆盖,CRM客户管理、ERP供应链管理、OA办公、电商交易、线下门店收银等各类系统每日产生海量数据。但海量数据并未转化为企业的数据资产,反而滋生了普遍的数据乱象:重复冗余的客户信息、格式…

2026/8/1 6:15:05 阅读更多 →
哈密顿回路算法全解析:从NP完全问题到工程实践

哈密顿回路算法全解析:从NP完全问题到工程实践

1. 项目概述:从“一笔画”游戏到NP完全问题聊到哈密顿回路,很多朋友可能觉得这是个高深莫测的图论概念,离实际开发很远。但如果你玩过那种要求“一笔画”不重复地走遍所有点的智力游戏,其实就已经在直观地理解它了。简单来说&…

2026/8/1 6:15:05 阅读更多 →
深度优先搜索(DFS)算法详解:从递归实现到回溯剪枝实战

深度优先搜索(DFS)算法详解:从递归实现到回溯剪枝实战

1. 从“走迷宫”到“穷举一切”:理解DFS的直觉如果你玩过那种经典的迷宫游戏,或者尝试过破解一个简单的数字密码锁,那么你已经体验过深度优先搜索(DFS)最朴素的思想了。想象一下,你站在一个迷宫入口&#x…

2026/8/1 6:14:04 阅读更多 →

日新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/8/1 5:19:34 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →