计算机中所以的信息都是以二进制的形式表示,即 0 和 1 。1 个二进制位的数据传输是以 “位”(bit)为单位。
市面上我们经常能看到x86-64位操作系统,如我的电脑就是64位的操作系统。 x84是inter在研发cpu的一种型号,我们把这种架构统称位x86架构,而后面的64位或者32位,是cpu中一次可以取出多少个二进制数(在1.1中我们了解到一个二进制数在计算机里就是一位,即1bite)。 下图为我的电脑
很多人在了解到上述两种结构时会发现自己的64位系统能够运行32位的应用程序,这是由于cpu具有向下兼容性。因为64位是cpu一次最多能够提取出多少位,不是只能提取多少位。就好比一条马路有64个车道,代表最多可以走64辆车,当然32位也是可以通过的。而在x84架构中,我们的cpu每一次提供一条不可分割的32位指令传递给cpu,这样说明了64位系统为什么可以运行32位程序。
了解上述内容后我们来看指针的内存大小。首先,指针就是一个变量,用来存储地址信息。所以无论什么类型的指针,其内存大小都是相同的,都是数据的存储空间长度。
32位----32bit----4Byte
64位----64bit----8Byte 原理是因为不同系统中cpu能够一次性提取的位不同,所以地址长度也不同。 注:一个字节(Byte)有8比特(bite)
我们现在x86-32位系统上进行编译 (visual studio2019开发环境)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 0;
//%p是以地址形式打印
printf("%p",&a);
return 0;
}
(%p是以地址形式打印) 运行结果:
一个字节是右两个16进制数表示的,图中006FF8F8一共8个16进制数 所以应该是4个字节 让我们用sizeof()操作符来运算一下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 0;
int * p = &a;
//sizeof()操作符计算的结果是size_t(无符号数)类型,所以用%zd
printf("%zd\n",sizeof(p));
return 0;
}
其运行结果为:4
果然不出我们所料,结果是正确的。
现在我们换到x64系统来看一下指针的内存大小
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 0;
int * p = &a;
printf("%p\n",p);
printf("%zd\n",sizeof(p));
return 0;
}
结果如图:
可以来说结果完全符合我们的上述的解释。
指针的内存大小就是变量的地址长度。在不同系统环境中其地址长度也不同,所以指针内存的大小通常为4字节(32位)或者8字节(64位)。