pnc是什么意思| 手上有湿疹是什么原因引起的| 一天从早到晚叫什么日| 什么样的男人值得托付终身| 呼吸机vt代表什么| 朝对什么| 茔是什么意思| 砥砺前行什么意思| 断码是什么意思| 炖肉什么时候放盐| 他达拉非是什么药| 苏打水为什么是甜的| 牙齿咬不动东西是什么原因| oid是什么意思| 萱五行属什么| 4月14日是什么星座| 什么地流淌| 虾不能和什么东西一起吃| 鸦雀无声是什么意思| 分开后我会笑着说是什么歌| 吃什么蔬菜能降血脂| 世界上最大的岛是什么岛| 梦见网鱼是什么征兆| 缪斯什么意思| 狗癣用什么药最有效| 711是什么星座| 甲沟炎去医院挂什么科| 看肝胆挂什么科| 什么是肾上腺素| 什么人容易得红斑狼疮| 口腔溃疡什么症状| 梦见被狗追是什么意思| 阑尾炎在什么位置疼| 寻常疣用什么药膏| 腿上有青筋是什么原因| 薄荷绿是什么颜色| 纪委是做什么的| 动物的尾巴有什么作用| 唐氏筛查临界风险是什么意思| 什么叶子| 淋球菌是什么病| 反射弧太长是什么意思| 常放屁是什么原因| atp 是什么| 门诊号是什么意思| 阴虚火旺吃什么食物好| 35岁属什么| 脾胃是什么意思| mcn是什么意思| 浇去掉三点水读什么| 福州立冬吃什么| 龙涎香是什么东西| 经常想吐恶心是什么原因| 小苏打有什么作用| 永垂不朽是什么意思| 珍珠五行属什么| 杏黄是什么颜色| 巴旦木和杏仁有什么区别| 2040年是什么年| 哪些动物的尾巴有什么作用| 成手是什么意思| 三焦指的是什么器官| 儿童过敏性结膜炎用什么眼药水| 钙过量会有什么症状| 啄木鸟为什么不会脑震荡| 黑头发有什么好处脑筋急转弯| 中性粒细胞高是什么感染| 身上有白斑块是什么原因造成的| 指纹不清晰是什么原因| 甲亢可以吃什么| 取保候审是什么意思还会判刑吗| 多走路有什么好处| 人流后吃什么最补子宫| 飞机上什么不能带| 一岁宝宝流鼻涕吃什么药| 莘莘学子什么意思| 女人丹凤眼意味什么| 羊水偏少对胎儿有什么影响| 什么牌子的空调最好| 性激素六项挂什么科| 肠胃胀气吃什么药| 松花蛋不能和什么一起吃| 酱牛肉放什么调料| 调岗是什么意思| 趴着睡觉有什么坏处| 焦急的什么| 孕育是什么意思| 胃窦是什么意思| 上面一个山下面一个今读什么| 感光度是什么意思| 薛之谦为什么离婚| 早上九点半是什么时辰| 身上为什么会长小肉球| 天癸是什么意思| 三十六计最后一计是什么| 梨状肌综合症吃什么药| 三什么一什么| 埃及法老是什么意思| 碱性土壤适合种植什么| 蝶变是什么意思| 甲状腺去医院挂什么科| 结婚36年是什么婚| 荆芥的别名叫什么| 银屑病是什么引起的| 肾的主要功能是什么| 为什么说尽量不戴脚链| 胃溃疡有什么症状| 万中无一什么意思| 老出汗是什么原因| 阿斯顿马丁什么档次| 什么的草叶| 折煞是什么意思| 晚上七点半是什么时辰| 24h是什么意思| 念珠菌感染用什么药| 游山玩水是什么意思| 喝什么茶能降低血糖| 什么是ci| 后羿是一个什么样的人| 你最喜欢的食物是什么| 吃什么降血压| 露出什么意思| 布洛芬是什么| 一什么烟| 胸前出汗多是什么原因| 甲沟炎看什么科| 腰痛宁为什么晚上吃| 八零年属什么生肖| 暖皮适合什么颜色衣服| 雨云是什么字| 嘚是什么意思| 白头翁是什么意思| 性冷淡吃什么药| 胸痛是什么原因| 心无什么用| 宝宝什么时候开始长牙| ugg是什么品牌| 西安五行属什么| 感冒吃什么药最快| 黄曲霉菌是什么颜色| 慢性子宫颈炎是什么意思| 宝典是什么意思| 7o年属什么生肖| 左手食指麻木是什么原因引起的| 未亡人什么意思| 头孢是治疗什么的| pickup是什么意思| cd138阳性是什么意思| 乳酪和奶酪有什么区别| 红曲米是什么| 搓是什么意思| 蛋白粉什么时候吃| 什么是老公| 国行是什么意思| 肚子饱胀是什么原因| 补血最快的方法是什么| 内科主要看什么病| 彗星尾征是什么意思| 酒精肝吃什么药| 松露是什么| 定日是什么意思| 内热是什么意思| 胃一阵一阵的疼吃什么药| 查传染病四项挂什么科| 石膏是什么| 腰闪了是什么症状| 清真不吃什么肉| 胎盘附着于子宫前壁是什么意思| 盆腔炎什么症状| captain是什么意思| 附件是什么意思| 女孩子学什么专业| 卵子排出体外是什么样子| 丧尽天良什么意思| joway是什么牌子| 补充镁有什么好处| 尿泡沫多是什么原因| 日加个立念什么| 男人硬不起来该吃什么药| 守株待兔是什么生肖| 全身而退是什么意思| 朋友圈提到了我是什么意思| 未时是什么时辰| 大麦是什么粮食| 耳朵疼吃什么药| 什么中药可以减肥| 什么时间最容易怀孕| 胳膊上的花是打了什么疫苗| 空窗期是什么| 5月12日什么星座| 狗头军师什么意思| 高代表什么生肖| p是什么面料| 衣原体感染是什么意思| 盆底肌高张是什么意思| 911是什么| 一般细菌涂片检查是查什么| 乙肝dna检测是查什么| 鸡胸挂什么科| 事物指的是什么| 三唑仑是什么| 露酒是什么意思| 白内障什么原因造成的| 好强的女人是什么性格| 阴道口溃疡用什么药| 子宫破裂有什么征兆| 气短挂什么科| 便秘吃什么好| 干姜和生姜有什么区别| 头头是道什么意思| 耳朵轮廓痒是什么原因| 室内用什么隔墙最便宜| 妯娌关系是什么意思| 簋是什么| 反流性食管炎吃什么药最有效| 东南角风水代表什么| 大姨妈来吃什么水果好| 胃炎吃什么中成药效果好| 肌醇是什么东西| 25羟基维生素d是什么| 芋圆是用什么做的| 明天什么日子| 两胸中间疼是什么原因| 什么是介入手术| 易激惹是什么意思| 啖是什么意思| 甲状腺在什么位置图片| 饭后痰多是什么原因| 什么是植物油| 蛐蛐吃什么食物| 明朝北京叫什么| 早泄有什么办法| 尿不干净有余尿是什么原因| 什么什么不平| 7号来的月经什么时候是排卵期| 水落石出开过什么生肖| 扁桃体发炎吃什么消炎药| 腿总是抽筋是什么原因| 蛟龙是什么| 容易出汗是什么原因| 台启是什么意思| 吃什么可以提升白细胞| 二元酸是什么| 酮体是什么| 杨梅吃了有什么好处| 夹心饼干是什么意思| 母猪上树是什么生肖| 9.3是什么日子| 先兆流产什么意思| 查肾挂什么科| 二尖瓣微量反流什么意思| 黄色加蓝色等于什么颜色| 双签是什么意思| 8月一日是什么节日| 头疼按什么穴位| 求知欲的欲什么意思| 陶白白是什么星座| 什么外之什么| classic是什么牌子| 什么洗发水去屑效果好| 狗狗流眼泪是什么原因| 病案号是什么| 肺部ct应该挂什么科| 眼圈黑是什么原因| 百度
发新帖本帖赏金 50.00元(功能说明)我要提问
返回列表
打印
[开发工具]

滴滴进军共享单车领域 青桔单车仅一天

[复制链接]
1253|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DKENNY|  楼主 | 2025-5-13 17:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 DKENNY 于 2025-5-13 17:25 编辑

#申请原创#  #技术资源#   @21小跑堂

前言:指针为啥这么“麻烦”?

      哈喽,各位好!,今天想跟大家聊聊C语言里一个让新手抓狂的玩意儿——指针!  
      你是不是也有这疑问:在嵌入式C里,指针不就是个内存地址吗?比如一串 0x1000 这样的数字?既然地址就是个编号,为啥还得指定 int *char * 这样的数据类型?地址不就是一串0x开头的数字吗,干嘛搞那么复杂?今天就这个问题跟大家聊聊。。

1. 指针的本质真是地址吗?
      绝对是的!在嵌入式C里,指针的本质就是内存地址
      啥叫内存地址?打个比方,假设内存是个超级大的货架,上面有无数小格子,每个格子有个编号,比如 0x10000x1004 这样的十六进制数字。每个格子存1字节(8位)的数据。
      指针呢?就是一张小纸条,上面写着某个格子的编号,告诉你“去这个格子找东西”。  
举个例子:
int a = 42;
int *p = &a;
     - a 是个整数,值是 42,假设存在内存的 0x1000 格子里。
      - p 是指针,里面存的值就是 0x1000 这个地址。
      - 用 *p,你就能去 0x1000 拿数据,看到 42


      可以形象的说,指针就是个“导航”,告诉你宝贝藏在内存哪个格子。比如 0x1000 就是个坐标,指针的任务就是带你去那儿。但光知道坐标不够,你还得知道格子里是啥宝贝,咋拿出来!

2. 地址就是0x数字,为啥还得指定数据类型?
      你肯定想:地址不就是 0x1000 这样的数字吗?直接用不就行了?为啥还得写 int *char *?  
      答案是:地址只告诉你“去哪个格子”,但不告诉你“格子里是啥”“拿多少”“咋拿”!数据类型就像个“说明书”,告诉编译器这些关键信息。  
      在嵌入式C里,类型尤其重要,因为你常直接戳硬件寄存器,弄错类型可能让设备直接异常。那么开发中,类型这玩意儿为啥不能少呢?

(1)类型决定拿多少字节
      内存按字节存,每个地址对应1字节。但不同数据占的字节数不同:
        - char:1字节
        - int:4字节(32位系统)
        - uint32_t:4字节
        - double:8字节
      指针用的时候,编译器得知道从地址开始,读或写多少字节。类型就是“尺寸表”。


(2)类型决定咋解读数据
      即使字节数一样,不同类型让编译器用不同方式解码数据。比如,4字节可以是:
        - uint32_t:无符号整数
        - float:浮点数
      没类型,编译器不知道咋解码,可能读出乱码。


(3)类型决定指针咋跳
      指针可以做运算,比如 p + 1。但“+1”不是加1字节,而是看类型:
        - uint32_t *p + 1 加 4 字节。
        - uint8_t *  :p + 1 加 1 字节。


      在嵌入式C里,指针运算常用来遍历数组或寄存器组,步长错不得。

(4)类型帮你少犯错
      类型让编译器查错,比如:
int a = 42;
float *p = &a; // 编译器报警:类型不对!
     没类型,编译器发现不了错,可能读到垃圾数据,程序崩盘。
      类型可以说是一个标签,告诉你抽屉里是苹果还是香蕉。标签错了,你拿香蕉当苹果啃,程序就“拉肚子”了!

3. 代码实验:亲眼看类型咋回事
      下面给段能跑的嵌入式C代码,用不同类型指针戳同一个地址,让你看类型咋影响“拿多少”“咋解码”“跳多远”。
// 模拟内存,装点数据
uint8_t buffer[] = {0x78, 0x56, 0x34, 0x12, 0x00, 0x00, 0x00, 0x00};

int main()
{
    USARTInit();
    // buffer的起始地址(实际地址系统给)
    void *base_addr = buffer; // void指针,只存地址
    printf("起始地址: %p\r\n\r\n", base_addr);

    // 用不同类型指针戳同一地址
    // (1) 32位整数指针(4字节)
    uint32_t *p_uint32 = (uint32_t *)base_addr;
    printf("uint32_t 指针:\r\n");
    printf("  地址: %p, 值: 0x%08X (%u)\r\n", p_uint32, *p_uint32, *p_uint32);
    printf("  下个地址 (p_uint32 + 1): %p\r\n\r\n", p_uint32 + 1);

    // (2) 8位整数指针(1字节)
    uint8_t *p_uint8 = (uint8_t *)base_addr;
    printf("uint8_t 指针:\r\n");
    printf("  地址: %p, 值: 0x%02X (%u)\r\n", p_uint8, *p_uint8, *p_uint8);
    printf("  下个地址 (p_uint8 + 1): %p\r\n\r\n", p_uint8 + 1);

    // (3) 浮点数指针(4字节)
    float *p_float = (float *)base_addr;
    printf("float 指针:\r\n");
    printf("  地址: %p, 值: %f\r\n", p_float, *p_float);
    printf("  下个地址 (p_float + 1): %p\r\n\r\n", p_float + 1);

    // (4) void指针(没类型)
    void *p_void = base_addr;
    printf("void 指针:\r\n");
    printf("  地址: %p\r\n", p_void);
    // 不能直接读值,会报错
    // printf("值: %d\r\n", *p_void); // 错!
    printf("  下个地址 (p_void + 1): %p\r\n", (uint8_t *)p_void + 1); // 编译报错,强制转为uint8_t

    while(1);
}
  代码咋回事?
      - buffer:8字节数组,装数据 {0x78, 0x56, 0x34, 0x12, 0x00, 0x00, 0x00, 0x00},模拟内存。
      - 指针们:用 uint32_t *uint8_t *float *void * 指向 buffer 头地址。
      - 干啥
        - 读值(*p),看类型咋影响解码。
        - 算地址(p + 1),看步长差别。

   跑出来啥?
      这是在APM32F4系列上运行的结果。


   看啥差别?
      1. 拿多少
        - uint32_t * 拿4字节(0x12345678)。
        - uint8_t * 拿1字节(0x78)。
        - float * 拿4字节,但解码成浮点数。
      2. 咋解码
        - 4 字节(0x78, 0x56, 0x34, 0x12),uint32_t 是 305419896,float 是 0x0(可能是该数据的存储格式和浮点数的二进制编码不匹配)。
      3. 跳多远
        - uint32_t * 和 float * 跳4字节(0x2000002C)。
        - uint8_t * 和 void * 跳1字节(0x20000029)。
      4. void指针
        - 没法直接读值,证明没类型啥也干不了。
      这么来看,同一个抽屉(0x20000028),用不同“钥匙”(类型)开,拿的东西(值)和下步位置(地址)都不一样!

4. 嵌入式C里类型为啥更关键?
      在嵌入式C里,指针类型不是闹着玩的!我们常直接操作硬件寄存器,比如:
#define REG_ADDR 0x40000000
uint32_t *reg = (uint32_t *)REG_ADDR;
*reg = 0xDEADBEEF; // 写32位数据
     - 寄存器要是32位的,错用 uint8_t * 只写1字节(0xEF),硬件可能直接“宕机”。
      - 还有内存对齐:uint32_t 得在4的倍数地址(像 0x1000),用 0x1001 可能崩。

5. 没类型咋整?void指针行不行?
      C语言有个“无类型”指针,叫 void *,但它很鸡肋,看看这段这段代码,其中就存在一些问题。
// (4) void指针(没类型)
    void *p_void = base_addr;
    printf("void 指针:\n");
    printf("  地址: %p\n", p_void);
    // 不能直接读值,会报错
    // printf("值: %d\n", *p_void); // 错!
    printf("  下个地址 (p_void + 1): %p\n", p_void + 1);
       - 不能直接读值(*p_void 报错),因为编译器不知道拿多少字节。
        - 运算步长不明确(p_void + 1 通常是1字节,但不标准,有的编译器直接编译报错,像Keil的ARMCC)。
        - 得转成具体类型才能用:
void *p = buffer;
uint32_t *q = (uint32_t *)p;
*q = 42; // 转类型后才能用
     void * 就像一张只有地址的藏宝图,只告诉你位置,但没说明里面是什么数据、怎么取。你需要先指定类型(通过类型转换),否则无法正确访问数据!

6. 总结:地址为啥还得配类型?
      - 指针就是地址,内存的格子编号(0x1000),在嵌入式C里尤其常用来戳寄存器。
      - 类型是说明书,告诉你:
        1. 拿多少字节(尺寸)。
        2. 咋解码数据(整数、浮点数)。
        3. 指针运算跳多远(步长)。
        4. 防出错(类型检查)。
        5. 嵌入式里不能错(硬件认类型)。
      地址就像一个坐标,指向内存位置;类型是使用手册,告诉你数据的种类、读取多少字节以及如何解析!没有类型手册,你就无法正确取出内存中的数据!


附件:文章例程: PointerTypeTemplate.zip (782.07 KB)



打赏榜单

21小跑堂 打赏了 50.00 元 2025-08-04
理由:恭喜通过原创审核!期待您更多的原创作品~~

评论
21小跑堂 2025-5-14 16:09 回复TA
图文结合,形象比喻,非常容易理解指针的含义。以简单易懂的文字配上清晰的图片,揭开指针的神秘面纱。 
沙发
呐咯密密| | 2025-5-14 14:56 | 只看该作者
通俗易懂,解释的非常好
板凳
dffzh| | 2025-5-14 15:10 | 只看该作者
C语言的灵魂是什么? 那就是指针;
能玩转指针的朋友绝对是C语言高手;
楼主分享的文章都比较详细,值得看看
地板
天罡星lmy| | 2025-5-14 16:00 | 只看该作者
写的真不错,点赞
5
cooldog123pp| | 2025-5-15 11:51 | 只看该作者
写的很不错啊。问下楼主你的状态图用什么软件做的,挺好看的,学习学习以后发帖用得上。
6
DKENNY|  楼主 | 2025-5-15 15:34 | 只看该作者
cooldog123pp 发表于 2025-5-15 11:51
写的很不错啊。问下楼主你的状态图用什么软件做的,挺好看的,学习学习以后发帖用得上。 ...

我这里的图片都是用draw.io这款软件手工绘制的哦~
7
永恒的一瞥| | 2025-5-20 19:26 | 只看该作者
C指针嘛!
写代码的时候,可以让程序跟随思维的主要方式之一。
话说,指针的用法还是太高级了,这一篇帖子还是远远不够的
发新帖 本帖赏金 50.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

100

帖子

15

粉丝
不二法门是什么意思 梦见打别人是什么意思 人的运气跟什么有关 10年是什么婚 tr什么意思
什么是溶血性疾病 胃疼挂什么科 周海媚什么病 胡桃木色是什么颜色 已故是什么意思
不典型鳞状细胞是什么意思 眼睛痒用什么滴眼液 监视居住是什么意思 吃什么瘦肚子脂肪最快 feat什么意思
一等功有什么待遇 睡觉为什么会磨牙 肛门长肉球是什么原因 四不像是指什么动物 pr间期延长是什么意思
左边头疼是什么原因怎么办hcv7jop5ns0r.cn 什么是音调hcv8jop0ns7r.cn 9月3日是什么星座的hcv9jop4ns5r.cn as是什么意思hcv8jop4ns6r.cn 敛肺是什么意思hcv7jop4ns6r.cn
黑枸杞泡水后什么颜色hcv8jop6ns6r.cn 冗长什么意思hcv9jop3ns0r.cn 00年属龙的是什么命hcv8jop9ns8r.cn 唐僧成了什么佛hcv9jop5ns3r.cn sg比重是什么意思hcv9jop6ns6r.cn
老人尿失禁吃什么药最好hcv7jop9ns0r.cn 双侧下鼻甲肥大是什么意思hcv8jop1ns6r.cn 胎儿靠什么吸收营养hcv8jop6ns1r.cn 镜花缘是什么意思hcv9jop2ns4r.cn 麻鸡是什么鸡hcv9jop0ns8r.cn
脱氢酶高是什么原因hcv9jop1ns4r.cn 人参不能和什么一起吃hcv8jop2ns1r.cn 男人为什么好色hcv9jop0ns6r.cn 为什么光吃不拉大便hcv7jop4ns7r.cn 南通有什么特产hcv8jop3ns9r.cn
百度