You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于C语言指针类型转换与内存读取的技术疑问

问题分析与解答

核心差异:指针类型的作用

指针的类型不仅决定了指向的内存大小,更关键的是决定了解引用时如何读取和解释内存中的字节:

  • float*解引用时,会从指针指向的地址开始读取4个字节,并按照单精度浮点数的格式解析成float值;
  • char*解引用时,只会从指针指向的地址读取1个字节,并按照ASCII字符(或无符号字节)解析。

对各输出行的详细解释

Line 1 & Line 3:输出不可识别字符

(char*) flt_ptr和(char*) ch_ptr本质是把指针(内存地址值)强制转换成char*类型,但printf的%c格式符期望接收一个int类型的参数(char会自动提升为int)。这里实际传递的是指针的地址值(比如0x7ffeefbff5ac),%c会取这个地址值的低8位当作ASCII码输出,而这个值通常对应不可打印字符,所以输出乱码。

Line 2:输出'A'

(char)*flt_ptr的执行流程是:

  1. 通过*flt_ptr解引用float指针,读取4个字节解析得到float值65.78;
  2. 将float值强制转换为char类型,此时会截断小数部分,只保留整数部分65;
  3. 65对应ASCII码的'A',所以输出符合预期。

Line 4:输出对应92的字符

(char)*ch_ptr的执行流程完全不同:

  1. ch_ptr是char*类型,指向value的内存起始地址;
  2. 解引用时只读取该地址处的1个字节,而不是整个float的4个字节;
  3. 这个字节的内容由float的内存存储格式和字节序决定:
    • 单精度浮点数65.78在内存中是以IEEE 754标准存储的32位二进制数据;
    • x86架构的系统采用小端序(低字节存放在内存低地址),所以float的4个字节中,数值最低的字节会被char*先读取到;
    • 你看到的92(十六进制0x5C)就是65.78对应的float内存中第一个低地址字节的数值,它和float值的整数部分65没有直接关系,只是浮点数二进制存储的一部分。

验证方法

如果你想确认value的内存布局,可以用这段代码打印每个字节的十六进制值:

#include <stdio.h>

int main(){
    float value = 65.78;
    char *ch_ptr = (char*) &value;
    
    // 打印float的4个字节(小端序)
    for(int i=0; i<sizeof(float); i++){
        printf("Byte %d: 0x%02X\n", i, (unsigned char)ch_ptr[i]);
    }
    return 0;
}

运行后你会看到65.78在内存中存储的4个字节,第一个字节就是line4读取的内容。

内容的提问来源于stack exchange,提问作者Jojo_aka_Hansen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 15:13:10