例如: Sizeof (char*)返回4。还有int* long long*,我试过的所有方法。有什么例外吗?
当前回答
除了人们所说的64位(或其他)系统,还有其他类型的指针,而不是指向对象的指针。
指向成员的指针几乎可以是任何大小,这取决于编译器如何实现它们:它们甚至不一定都是相同的大小。尝试一个POD类的指向成员的指针,然后尝试一个继承自具有多个基类的基类之一的指向成员的指针。什么乐趣。
其他回答
除了16位/32位/64位的差异之外,还会发生更奇怪的事情。
曾经有一些机器sizeof(int *)是一个值,可能是4,但sizeof(char *)更大。自然地处理单词而不是字节的机器必须“增加”字符指针,以指定您真正想要的单词的哪一部分,以便正确地实现C/ c++标准。
现在这是非常不寻常的,因为硬件设计师已经了解了字节可寻址性的价值。
出于完整性和历史兴趣,在64位世界中,对于长类型和长类型的大小有不同的平台约定,分别命名为LLP64和LP64,主要在unix类型系统和Windows之间。一个名为ILP64的旧标准也使int = 64位宽。
微软保留了LLP64,其中longlong = 64位宽,但long保留为32位宽,以便于移植。
Type ILP64 LP64 LLP64
char 8 8 8
short 16 16 16
int 64 32 32
long 64 64 32
long long 64 64 64
pointer 64 64 64
来源:https://stackoverflow.com/a/384672/48026
据我所知,这是基于内存地址的大小。所以在一个32位地址方案的系统上,sizeof将返回4,因为那是4个字节。
指针只是一个地址的容器。在32位计算机上,您的地址范围是32位,因此指针总是4字节。在64位机器上,如果你的地址范围是64位,一个指针将是8字节。
在windows 32位机器上的Turbo C编译器中,指针和int的大小为2字节。
所以指针的大小是编译器特定的。但一般大多数编译器实现为支持32位4字节指针变量和64位8字节指针变量)。
所以指针的大小在所有机器上都是不一样的。