gpt4 book ai didi

c - 16 位和 32 位的指针大小

转载 作者:太空宇宙 更新时间:2023-11-04 00:07:23 27 4
gpt4 key购买 nike

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

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

谢谢。

最佳答案

简短回答:在 32 位 Intel 386 上,您可能会看到这些返回 4,而针对 16 位 8086,您很可能会看到 2 或 4,具体取决于您选择的内存模型。

详情

第一个标准 C 对指针没有任何特殊要求,只要求它们能够“指向”给定变量,并且指针算法需要在给定变量的数据区内工作。即使是具有一些奇特的指针表示的 C 解释器也是可能的,并且鉴于这种灵 active ,指针确实可以是任何大小,具体取决于您的目标。

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

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

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

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

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

另请注意,这些是指针类型不是它们指向的数据类型(函数指针在这里有点偏离,因为指针是一个函数指针意味着它与数据指针是不同的类型,除了它指向的数据类型是函数类型之外没有任何特定的语法差异。

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

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

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

关于c - 16 位和 32 位的指针大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17951909/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com