C中指针的大小是否有变化?

可能重复:
指针的大小可以根据指向的内容而有所不同吗?
是否有任何平台指向不同types的指针有不同的大小?

c中指向float的指针的大小是否可以和指向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; } 

这里的输出(OSX 10.6 64位)

 sizeof(int*): 8 sizeof(float*): 8 sizeof(void*): 8 

我能否假设不同types的指针具有相同的大小(当然是在一个拱门上)?

指针在相同的拱门上并不总是相同的大小。

你可以阅读更多关于“近”,“远”和“巨”指针的概念,就像指针大小不同的例子一样。

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

在DOS平台上使用例如Borland C编译器的日子里,总共有(我认为)5种内存模型,甚至可能在某种程度上混合使用。 本质上,你可以select指向数据的小指针或大指针,指向代码的小指针或大指针,以及代码和数据具有共同地址空间(如果我没记错的话)64K的“小”模型。

有可能在一个程序中指定“巨大的”指针,而这个指针是用“微小的”模型构build的。 所以在最坏的情况下,可能在同一个程序中有不同大小的指针指向相同的数据types

我认为这个标准甚至没有禁止这个,所以从理论上来说,一个晦涩难懂的C编译器甚至可以做到这一点。 但毫无疑问,专家们将能够确认或纠正这一点。

指向数据的指针必须始终与void*兼容,所以现在通常将它们实现为相同宽度的types。

这个语句对于函数指针来说是不正确的,它们可能有不同的宽度。 因为这个原因,在C99中将函数指针指向void*是未定义的行为。

据我所知,在C标准中没有任何东西可以保证指向不同types的指针必须是相同的大小,所以在理论上,同一个平台上的int *和float *可以是不同的大小而不会违反任何规则。

有一个要求,char *和void *具有相同的表示和alignment要求,并且针对指针types的不同子集有各种其他类似的要求,但没有包含所有的东西。

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

是的,指针的大小取决于平台。 更具体地说,指针的大小取决于目标处理器架构和编译的“比特性”。

根据经验,在64位机器上,指针通常是64位,在32位机器上通常是32位。 但也有例外。

由于指针只是一个内存地址,它的大小始终是相同的,不pipe它指向的内存是什么。 所以一个指向float,char或int的指针都是相同的大小。

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

这可能听起来奇特,但是许多DSP花费99.x%的时间执行专门的数字代码。 一个声音DSP可以简单一点,如果它只需处理16位数据,偶尔的8位math运算将被编译器模拟。

我要写一个答复,说C99有各种指针转换的要求,或多或less确保指针数据必须是相同的大小。 然而,在仔细阅读它们之后,我意识到C99专门devise用于允许不同types的指针具有不同的大小。

例如,在整数是4个字节并且必须是4个字节alignment的体系结构中,int指针可能比char或void指针小两位。 如果演员实际上在两个方向都有转变,那么C99就可以。 它有用地说,将一个char指针转换为一个不正确alignment的int指针的结果是不确定的。

见C99标准 。 第6.3.2.3节

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

对于具有平坦内存模型的平台(==所有stream行/现代平台),指针大小将是相同的。

对于具有分段内存模型的平台来说,为了提高效率,通常会有不同大小的平台特定的指针types。 (例如在DOS中使用far指针,因为8086 CPU使用分段内存模式。)但这是平台特定的和非标准的。

您可能应该记住,在C ++中,正常指针的大小可能与指向虚拟方法的大小不同。 指向虚拟方法的指针必须保留额外的信息,以防止与多态性正常工作。 这可能只是我意识到的exception,这仍然是相关的(因为我怀疑分段存储器模型将永远无法恢复)。

无论指向哪种数据types,指针在同一个拱形中的大小始终相同。 否则像不同的指针types之间的投射是无用的,并打破了很多东西。

许多常见的编码技术依赖于根据大小在诸如空指针(或char)与各种结构之间进行投射。

即使是标准的printf(),也必须能够指向各种数据。 如果指针的大小不同,实现printf可能会变得非常混乱。

有些平台的函数指针的大小与其他指针不同。

我从来没有看到比这更多的变化。 所有其他指针最多只能是sizeof(void *),因为标准要求可以在不丢失信息的情况下将其转换为void *。

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

因此,不pipe指针指向的东西的数据types如何,特定机器上指针的大小都是相同的(因为存储地址所需的空间是相同的)。

假设:我正在讨论关于数据值的指针,你在问题中声明的types。