指针占用了多少字节?

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

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

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

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

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

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

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

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

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

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

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

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

回答是sizeof(某些指针)总是等于4吗?

指针用于存储变量的地址。内存地址/位置的宽度取决于计算机体系结构。如果计算机体系结构是16位,则意味着它可以有2 ^ 16个内存位置。因此,对于指针能够存储该计算机中的任何存储单元,它应该是16位宽,即2字节(8位= 1字节)。 类似地,对于32位和64位架构,我们需要分别具有大小为4字节(32位宽度)和8字节(64位宽度)的指针。
此外,如果系统是16位,则它不能具有大于16位的地址位置。

这将告诉您在系统上表示指针所需的字节数。

  #include  int main() { printf("%ld bytes per pointer\n", sizeof(void *)); } 

这是一个编译器标志,您可以使用该主题:

 $ gcc -m32 -o prog32 prog.c $ gcc -m64 -o prog64 prog.c 

第一行为32位环境生成二进制文件,为您提供4个字节的指针。 第二行为64位环境生成二进制文件,为您提供8个字节的指针。 您可以通过运行上述程序来确认这一点。

假设,您使用的是GCC的64位系统。 希望这能澄清一些事情。