为何不同类型指针占用相同内存?指针大小为何取决于平台?
每种指针旨在指向不同的数据类型,但实际上所有指针都可能占用相同的内存空间(指针的内存大小取决于程序运行的平台)。
关于指针内存大小的两个问题解答
问题1:为何不同类型的指针会占用相同的内存空间?
指针的核心就是存储内存单元的起始地址——不管它指向的是int、double还是自定义结构体,本质上都是记录某块内存在整个地址空间里的位置。
所谓的“指针类型”,只是给编译器的提示:告诉编译器从这个地址开始,应该以多大的步长访问内存、如何解析内存里的二进制数据。但这些规则和指针本身存储的地址值没有关系。
在现代主流的32位、64位平台上,所有内存地址的长度是固定的(比如32位平台地址是32位,对应4字节;64位是64位,对应8字节),所以不管指针指向什么类型,存储这个地址需要的空间都是一样的。当然也有例外,比如一些老旧的16位分段架构中,不同类型的指针可能因为分段机制存在大小差异,但这种情况现在已经很少见了。
问题2:为何指针的内存大小取决于运行平台?
指针的大小直接由平台的地址总线宽度(或者说CPU的寻址能力)决定:
- 32位平台的CPU地址总线是32位,最多能寻址2^32字节(约4GB)的内存,所以指针需要用32位(4字节)来存储完整的地址;
- 64位平台的地址总线是64位,能寻址的内存范围远大于32位平台,对应的指针就需要64位(8字节)来存储地址;
- 一些嵌入式平台(比如8位单片机),地址总线可能是16位,指针就只需要2字节就能存储所有可能的地址。
简单说,平台能处理的地址长度有多长,指针就需要多大的空间来装这个地址。
内容的提问来源于stack exchange,提问作者user19552329
相关产品推荐
相关产品推荐

