例如: Sizeof (char*)返回4。还有int* long long*,我试过的所有方法。有什么例外吗?


当前回答

除了16位/32位/64位的差异之外,还会发生更奇怪的事情。

曾经有一些机器sizeof(int *)是一个值,可能是4,但sizeof(char *)更大。自然地处理单词而不是字节的机器必须“增加”字符指针,以指定您真正想要的单词的哪一部分,以便正确地实现C/ c++标准。

现在这是非常不寻常的,因为硬件设计师已经了解了字节可寻址性的价值。

其他回答

如果您正在为64位机器编译,那么它可能是8。

一般来说,当你在不同的平台上编译时,sizeof(几乎任何东西)都会改变。在32位平台上,指针的大小总是相同的。在其他平台上(64位是最明显的例子),这种情况可能会发生变化。

只是已经发布的列表中的另一个例外。在32位平台上,指针可以占用6字节,而不是4字节:

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

int main() {
    char far* ptr; // note that this is a far pointer
    printf( "%d\n", sizeof( ptr));
    return EXIT_SUCCESS;
}

如果你用Open Watcom编译这个程序并运行它,你会得到6,因为它支持的远指针由32位偏移量和16位段值组成

除了人们所说的64位(或其他)系统,还有其他类型的指针,而不是指向对象的指针。

指向成员的指针几乎可以是任何大小,这取决于编译器如何实现它们:它们甚至不一定都是相同的大小。尝试一个POD类的指向成员的指针,然后尝试一个继承自具有多个基类的基类之一的指向成员的指针。什么乐趣。

你得到的保证是sizeof(char) == 1。没有其他保证,包括没有保证sizeof(int *) == sizeof(double *)。

在实践中,指针的大小在16位系统上为2(如果您能找到一个),在32位系统上为4,在64位系统上为8,但是依赖于给定的大小并不能获得任何东西。