为何强制转换指针类型后,指针的值并未发生改变?
为什么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
相关产品推荐
相关产品推荐

