我只是想知道sizeof
指针返回16位和32位系统会是什么
printf("%d", sizeof(int16 *));
printf("%d", sizeof(int32 *));
谢谢。
答案 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:
如果您使用某些内存模型,编译器假定您拥有单个数据段,那么如果您没有明确声明一个near
或far
,则可能会获得2字节数据指针。否则,默认情况下,您将获得4个字节的指针。 2字节指针的表示通常只是16位偏移,而对于4字节指针,它是段:偏移对。您始终可以应用near
或far
说明符来明确地将指针设置为一种或另一种类型。
(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。 (与今天计算机的内存量相比,真的很少)。