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

为何强制转换指针类型后,指针的值并未发生改变?

为什么int32_t指针强转为int8_t指针后地址值不变?

首先得理清两个容易混淆的概念:指针自身的宽度和指针指向的数据类型宽度:

  • 指针的本质是存储内存地址的变量,它的宽度由操作系统架构决定(比如32位系统是4字节,64位系统是8字节),和它指向的数据类型完全无关。不管是int32_t*还是int8_t*,存储的都是内存单元的起始地址值,所以强制转换不会改变这个地址值。
  • 你误以为会从“32位地址变8位地址”,其实是把指针指向的数据类型的宽度(int32_t是4字节、int8_t是1字节)和指针自身的地址宽度搞混了。

再看你给出的代码:

#include <stdio.h>
#include <stdint.h>

int main()
{
    int32_t * first = (int32_t *) 0xFFFFFFFF;
    int8_t * second = (int8_t *) first;

    printf("Gives: %p\n", first);
    printf("Gives: %p\n", second);

    return 0;
}

这里0xFFFFFFFF是你指定的内存地址值,把它赋值给int32_t*类型的指针first,再转成int8_t*类型的second,本质只是告诉编译器:后续对second的操作要按照1字节数据的规则来处理(比如解引用时只读取1字节),但存储的地址值还是0xFFFFFFFF,所以用%p输出时结果完全一致。

简单总结:指针类型转换的作用是改变编译器对内存访问的解读方式,而不是修改指针存储的地址本身。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 22:59:51