指针占用了多少字节?

Gov*_*tFX 13 c pointers

我对指针和它们占用的字节有点困惑.在我的教科书中,它首先说明16位系统上的指针占用2个字节,32位系统占用4个字节,64位系统占用8个字节,依此类推.然后是10行,它表示指针占用了许多字节,这是保存地址所需的.这是我的问题:

  1. 那么这是否意味着如果我们在64位系统上说,地址最多需要8个字节?
  2. 如果我们在16位系统上,指针占用2个字节,并且地址需要更多2个字节,那么会发生什么?

NPE*_*NPE 10

简短的回答是它取决于.当我们说系统是32位时,这可能意味着本机整数是32位宽,本机地址(即指针大小)是32位宽,或两者兼而有之.

最重要的是,并非每个架构都使用平面内存模型(例如,请参阅x86内存分段).这进一步使问题复杂化.

最好将指针的大小视为不透明.

C99提供了形式intptr_tuintptr_t类型的工具,这些工具是保证宽度足以容纳指针的整数.


Joh*_*ode 9

没有固定的答案; 它完全取决于体系结构,编译器实现,甚至指针本身的类型.不保证指向不同类型的指针具有相同的大小和/或表示.

例如,假设一个字寻址架构,其中最小的可寻址存储单元是16位宽(或更宽).每个单词可以包含多个char值; 所有其他类型都会占用一个或多个字.在这样的架构上,与其他指针类型相比,a char *void *将需要一些额外的位来偏移到字中.

还要注意,指针类型可能比存储地址实际所需的位数更宽.最初的Macintosh是在Motorola 68000 CPU上运行的,它具有32位字大小,但在地址总线上只有24位.指针类型为32位宽,高8位未使用.积极进取的MacOS程序员利用这一点将一些数据存储到指针类型的最高字节,充分利用了宝贵的128 KB RAM.当然,摩托罗拉最终发布了一个具有32个地址线(68020)的CPU,这意味着所有代码都必须重写.

在现代商品桌面和服务器硬件上(读取:x86),假设所有指针类型与本机字大小(32位或64位)相同,并且所有指针类型具有相同大小是相当安全的和代表.要知道,这不是真实的.


Rnd*_*p13 5

指针的大小基本上取决于实现它的系统的体系结构。例如,32 位指针的大小在 64 位机器中为 4 字节(32 位)和 8 字节(64 位)。机器中的位类型只不过是它可以保存的内存地址。32 位机器可以2^32容纳2^64地址空间,64 位机器可以容纳地址空间。因此,指针(指向内存位置的变量)应该能够指向2^32 for 32 bit and 2^64 for 64 bit机器拥有的任何内存地址 ( )。

由于这个原因,我们看到指针的大小在 32 位机器中为 4 个字节,在 64 位机器中为 8 个字节。

sizeof(some pointer) 总是等于四吗?