指针的大小与什么有关?

  1. cpu位数(32位数4字节,64位数8字节)
  2. 操作系统位数(32位数4字节,64位数8字节)
  3. 编译器的位数(32位数4字节,64位数8字节)

当上述3种位数不同,取最小的位数。
比如,如果CPU、系统都是64位的,但编译器是32位的,那么很显然指针只能是32位4字节大小。

我们的内存中有各种各样的数据,整型、浮点型、字符型等等。这些数据在内存中占据不同大小的储存空间,故用sizeof运算符(注:sizeof是种运算符而不是函数,它在编译时发挥作用)进行运算时结果是不同的。然而不同类型的指针在相同系统环境下进行这种运算时结果却是相同的。为什么呢?

众所周知,C语言中的指针描述的是内存中的地址。而内存地址这种东西则是由CPU进行编址的。对于一个4位的CPU来讲,它能同时输出的数据为4位,即0000-1111共24 种情况,故这些二进制数字只能对应到16个位置的内存地址,即CPU仅能识别出16个内存地址。即便你的内存再大,它也显示只有16个位置的内存可用。这种原理同样应用于32位和64位的CPU。

32位的CPU能同时呈现32个位的数据,故有232 种情况,对应到232 个内存位置也就是最大3.85GB大小,因此32位的系统只能支持最大4GB的内存。相比之下,64位的CPU能同时吞吐 264 位的数据,这显然能够对应到264 个内存的地址,而理论上这个大小换算成10进制则是相当大的数,如果对应到内存,此时一个很大的内存。所以我们说64位系统理论支持无穷大内存(这里的无穷大只是一种概念,因为我们不可能用到如此巨大容量的内存)。

综上,因为指针存放的是地址,所以32位内存,共4个字节;64位系统的64位地址共8个字节——你应该明白什么了吧!没错,32位指针4字节,64位指针8字节。

当然,CPU只是影响指针大小的首要因素,除了它之外还要看操作系统和编译器的位数。这里指针的大小由这三个东西中位数最小的那项决定。比如,如果CPU、系统都是64位的,但编译器是32位的,那么很显然指针只能是32位4字节大小。