我对指针和它们占用的字节有点困惑.在我的教科书中,它首先说明16位系统上的指针占用2个字节,32位系统占用4个字节,64位系统占用8个字节,依此类推.然后是10行,它表示指针占用了许多字节,这是保存地址所需的.这是我的问题:
那么这是否意味着如果我们在64位系统上说,地址最多需要8个字节?
如果我们在16位系统上,指针占用2个字节,并且地址需要更多2个字节,那么会发生什么?
NPE.. 10
简短的回答是它取决于.当我们说系统是32位时,这可能意味着本机整数是32位宽,本机地址(即指针大小)是32位宽,或两者兼而有之.
最重要的是,并非每个架构都使用平面内存模型(例如,请参阅x86内存分段).这进一步使问题复杂化.
最好将指针的大小视为不透明.
C99提供了形式intptr_t
和uintptr_t
类型的工具,这些工具是保证宽度足以容纳指针的整数.
简短的回答是它取决于.当我们说系统是32位时,这可能意味着本机整数是32位宽,本机地址(即指针大小)是32位宽,或两者兼而有之.
最重要的是,并非每个架构都使用平面内存模型(例如,请参阅x86内存分段).这进一步使问题复杂化.
最好将指针的大小视为不透明.
C99提供了形式intptr_t
和uintptr_t
类型的工具,这些工具是保证宽度足以容纳指针的整数.
没有固定的答案; 它完全取决于体系结构,编译器实现,甚至指针本身的类型.不保证指向不同类型的指针具有相同的大小和/或表示.
例如,假设一个字寻址架构,其中最小的可寻址存储单元是16位宽(或更宽).每个单词可以包含多个char
值; 所有其他类型都会占用一个或多个字.在这样的架构上,与其他指针类型相比,a char *
和void *
将需要一些额外的位来偏移到字中.
还要注意,指针类型可能比存储地址实际所需的位数更宽.最初的Macintosh是在Motorola 68000 CPU上运行的,它具有32位字大小,但在地址总线上只有24位.指针类型为32位宽,高8位未使用.积极进取的MacOS程序员利用这一点将一些数据存储到指针类型的最高字节,充分利用了宝贵的128 KB RAM.当然,摩托罗拉最终发布了一个具有32个地址线(68020)的CPU,这意味着所有代码都必须重写.
在现代商品桌面和服务器硬件上(读取:x86),假设所有指针类型与本机字大小(32位或64位)相同,并且所有指针类型具有相同大小是相当安全的和代表.要知道,这不有是真实的.