指针的大小为16位和32位

时间:2013-07-30 16:01:38

标签: c sizeof

我只是想知道sizeof指针返回16位和32位系统会是什么

printf("%d", sizeof(int16 *));
printf("%d", sizeof(int32 *));

谢谢。

2 个答案:

答案 0 :(得分:3)

简短回答:在32位英特尔386上,您可能会看到这些返回4,而目标是16位8086,您很可能会看到2或4,具体取决于您选择的内存型号。

详情

第一个标准C并没有强制指定任何特定的东西,只是它们需要能够“指向”给定的变量,并且指针算法需要在给定变量的数据区域内工作。即使是具有一些奇异的指针表示的C解释器也是可能的,并且考虑到这种灵活性,指针真的可以是任何大小,具体取决于你的目标。

然而,通常编译器确实用内存地址表示指针,这使得C标准“通常工作”的几个操作未定义。编译器选择如何表示指针的方式取决于目标体系结构:编译器编写者显然选择了有用且有效的表示。

有用的表示的示例是Harward架构微型的通用指针。它们允许您处理代码和数据RAM。在8位微处理器上,它们可能被编码为一个类型字节加上2个地址字节,这显然意味着无论何时取消引用一个这样的指针,都必须发出更复杂的代码以从正确的位置加载内容。

这为高效表示提供了一个很好的例子:为什么没有特定的指针呢?一个指向代码存储器,另一个指向数据存储器?只需2个字节(假设8位微处理器通常为16位地址空间,如8051),无需按类型选择。

但是你有多种类型的指针,呃(同样是8051:你可能至少有一种额外的指针指向它的内部RAM ......)。程序员然后需要考虑他需要使用哪种特定的指针类型。

当然尺寸也不同。在这个针对8051的假设编译器上,你将拥有一个3字节的通用指针类型,一个2字节的外部数据存储器指针类型,一个2字节的代码存储器指针,以及一个1字节的内部RAM指针类型。

还要注意这些是指针的类型,而不是它们指向的数据类型(函数指针在这里稍微偏离,因为指针是一个事实函数指针意味着它与数据指针的类型不同,但没有任何特定的语法差异,除了它指向的数据类型是函数类型。)

回到16位机器,假设它是8086:

如果您使用某些内存模型,编译器假定您拥有单个数据段,那么如果您没有明确声明一个nearfar,则可能会获得2字节数据指针。否则,默认情况下,您将获得4个字节的指针。 2字节指针的表示通常只是16位偏移,而对于4字节指针,它是段:偏移对。您始终可以应用nearfar说明符来明确地将指针设置为一种或另一种类型。

near指针如何在一个也使用far指针的程序中工作?只需编译器生成一个默认数据段,所有near都在其中。编译器可能只是永久地,或者至少在大多数情况下,ds段寄存器填充了默认数据段,因此near s指向的数据的访问可以更快)

答案 1 :(得分:-3)

指针的大小取决于体系结构。确切地说,它取决于该体系结构中使用的地址的大小,该地址反映了访问存储器的总线系统的大小。

例如,在32位架构上,地址的大小为4个字节:

sizeof (void *) == 4 Bytes. 

在64位上,addreses的大小为8字节:

sizeof (void *) == 8 bytes. 

注意,所有指针的大小与该类型相同。因此,如果执行代码,int16指针的大小和int32指针的大小将是相同的。

但是,16位系统上指针的大小应为2个字节。通常,16位系统的内存非常少(几兆字节),2个字节足以满足其所有位置。更准确地说,使用16位指针,您可以拥有的最大内存大约为65 KB。 (与今天计算机的内存量相比,真的很少)。