指针的大小在C中是否有所不同?

Nil*_*ils 30 c pointers

可能的重复:
指针的大小可能会变化,具体取决于指向的内容?
是否有任何平台指向不同类型的指针有不同的大小?

指向c中浮点的指针大小是否可能与指向int的指针不同?尝试过之后,我得到了各种指针的相同结果.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("sizeof(int*): %i\n", sizeof(int*));
    printf("sizeof(float*): %i\n", sizeof(float*));
    printf("sizeof(void*): %i\n", sizeof(void*));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这里有哪些输出(OSX 10.6 64位)

sizeof(int*): 8
sizeof(float*): 8
sizeof(void*): 8
Run Code Online (Sandbox Code Playgroud)

我可以假设不同类型的指针具有相同的大小(当然在一个拱门上)?

Joh*_*ski 21

指针在同一个拱门上的大小并不总是相同.

您可以阅读更多关于"近","远"和"巨大"指针的概念,就像指针大小不同的情况一样...

http://en.wikipedia.org/wiki/Intel_Memory_Model#Pointer_sizes

  • 有人可能会说,你所描述的不是"C".但自从DOS曾统治地球并且是事实上的标准以来,我给了你一票. (2认同)

Car*_*icz 12

在过去,使用DOS平台上如Borland的C编译器,总共有(我认为)5内存模型,其甚至可以混合在一定程度上是.从本质上讲,您可以选择指向数据的小型或大型指针,以及指向代码的小型或大型指针,以及"微型"模型,其中代码和数据具有共同的地址空间(如果我没记错的话)64K.

可以在程序中指定"巨大"指针,否则这些指针是在"微小"模型中构建的.因此,在最坏的情况下,可以在同一程序中使用不同大小的指针指向相同的数据类型!

我认为标准甚至不禁止这一点,所以从理论上讲,一个不起眼的C编译器甚至可以做到这一点.但毫无疑问,专家们将能够确认或纠正这一点.


Jen*_*edt 9

指向数据的指针必须始终兼容,void*因此通常它们现在将被实现为相同宽度的类型.

对于函数指针,此语句不正确,它们可能具有不同的宽度.因此,在C99中,转换函数指针void*是未定义的行为.

  • 所有这些意味着`void*`必须至少是最大的其他指针类型的大小. (3认同)
  • 确切地说 - 从`void*`转换为`double*`可能是有损的,但反之亦然. (2认同)
  • 有人可以解释什么是“宽度”(而不是“大小”)吗? (2认同)

MSa*_*ers 7

是的。这是不常见的,但这肯定会发生在不可字节寻址的系统上。例如,具有 64 Kword = 128KB 内存的 16 位系统。在这样的系统上,您仍然可以拥有 16 位 int 指针。但是指向 8 位字符的字符指针需要一个额外的位来指示字内的高字节/低字节,因此您将拥有 17/32 位字符指针。

这听起来可能很奇怪,但许多 DSP 花费了 99.x% 的时间来执行专门的数字代码。如果一个声音 DSP 只需要处理 16 位数据,那么它可能会更简单一些,而让编译器模拟偶尔的 8 位数学运算。


Nig*_*per 6

据我所知,C标准中没有任何内容可以保证指向不同类型的指针必须具有相同的大小,因此理论上同一平台上的int*和float*可以是不同的大小而不会破坏任何规则.

需要char*和void*具有相同的表示和对齐要求,并且对于指针类型的不同子集存在各种其他类似的要求,但是没有任何内容包含所有内容.

在实践中,你不太可能遇到任何使用不同大小指针的实现,除非你进入一些相当模糊的地方.


Jer*_*myP 5

我打算写一个回复说 C99 有各种指针转换要求,或多或少确保指向数据的指针必须具有相同的大小。然而,仔细阅读它们后,我意识到 C99 是专门设计来允许指针为不同类型的不同大小的。

例如,在整数为 4 字节且必须按 4 字节对齐的体系结构上,int 指针可能比 char 或 void 指针小两位。如果演员实际上在两个方向上都进行了转换,那么 C99 就可以了。它有助于说明将 char 指针转换为不正确对齐的 int 指针的结果是未定义的。

请参阅C99 标准。第 6.3.2.3 节


Gis*_*shu -1

指针是一个内存地址 - 因此在特定机器上应该是相同的。32 位机器 => 4 字节,64 位 => 8 字节。

因此,无论指针所指向的数据类型如何,特定机器上的指针的大小都是相同的(因为存储内存地址所需的空间是相同的。)

假设:我正在谈论指向数据值的近指针,即您在问题中声明的类型。

  • -1,错误。对于初学者来说,它假设指针指向缺少函数指针的数据(和数据类型)。DOS 上的 C 具有具有 16 位函数指针和 20/32 位数据指针的内存模型。 (5认同)