sizeof(某个指针)总是等于四?

例如: sizeof(char*)返回4.像int*long long* ,我试过的所有东西。 这有没有例外?

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

实际上,在16位系统上(如果你能find一个),指针的大小是2,在32位系统上是4,而在64位系统上是8,但是依靠给定的指针是没有什么好处的尺寸。

即使在普通的x86 32位平台上,您也可以获得各种指针大小,请尝试以下示例:

 struct A {}; struct B : virtual public A {}; struct C {}; struct D : public A, public C {}; int main() { cout << "A:" << sizeof(void (A::*)()) << endl; cout << "B:" << sizeof(void (B::*)()) << endl; cout << "D:" << sizeof(void (D::*)()) << endl; } 

在Visual C ++ 2008下,我得到了指针到成员函数大小的4,12和8。

雷蒙德在这里谈到这个。

已经发布的列表的另一个例外。 在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位机器,那么它可能是8。

从技术上讲,C标准只保证sizeof(char)== 1,其余的都是实现的。 但在现代x86架构(如Intel / AMD芯片)上,这是相当可预测的。

您可能听说过处理器被描述为16位,32位,64位等。这通常意味着处理器使用N位整数。 由于指针存储内存地址,并且内存地址是整数,所以这会有效地告诉您将要使用多less位指针。 sizeof通常以字节为单位进行度量,因此为32位处理器编译的代码会将指针的大小报告为4(每个字节32位/ 8位),64位处理器的代码将报告指针的大小为8 (每个字节64位/ 8位)。 这是32位处理器的4GB内存的限制来自 – 如果每个内存地址对应一个字节,为了寻址更多的内存,你需要大于32位的整数。

除了16/32/64比特差异之外,甚至会发生奇怪的事情。

有sizeof(int *)将是一个值的机器,可能是4,但sizeof(char *)更大。 那些自然而然地处理单词而不是字节的机器必须“扩充”字符指针来指定你真正想要的单词的哪一部分,以便恰当地实现C / C ++标准。

现在,硬件devise人员已经学会了字节寻址的价值,这是非常不寻常的。

除了人们对64位(或任何其他系统)的说法外,还有其他types的指针,而不是指向对象的指针。

成员指针可能几乎是任何大小,取决于编译器如何实现它们:它们不一定都是相同的大小。 尝试一个POD类的成员指针,然后指向一个具有多个基类的类的基类inheritance的成员指针。 真好玩

8位和16位指针用于大多数低调微控制器。 这意味着每台洗衣机,微型,冰箱,旧电视,甚至汽车。

你可以说这些与真实世界的编程无关。 但是这里有一个真实世界的例子:带有2字节指针的1-2-4k ram(取决于芯片)的Arduino。

这是最近,便宜,每个人都可以访问和值得编码。

指针的大小主要取决于实现该系统的体系结构。 例如,32位指针的大小在64位机器中是4个字节(32位)和8个字节(64位)。 机器中的位types只是内存地址,它可以拥有。 32位机器可以有2^32地址空间,64位机器可以有2^64地址空间。 所以一个指针(指向一个内存位置的variables)应该能够指向机器所拥有的任何内存地址( 2^32 for 32 bit and 2^64 for 64 bit )。

由于这个原因,我们看到指针的大小在32位机器中是4个字节,在64位机器中是8个字节。

从我记得,它是基于内存地址的大小。 因此,在一个32位地址scheme的系统上,sizeof将返回4,因为这是4个字节。

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

不,指针的大小可能因架构而异。 有很多例外。

指针和int的大小在Windows 32位机器上的Turbo C编译器中是2个字节。

所以指针的大小是编译器特定的。 但是通常大部分的编译器都支持32位的4字节指针variables和64位机器的8字节指针variables。

所以所有机器的指针大小都不一样。

指针大小为4字节的原因是因为您正在编译32位体系结构。 正如FryGuy指出的那样,在64位架构上你会看到8。

指针只是一个地址的容器。 在一个32位的机器上,你的地址范围是32位,所以一个指针总是4个字节。 在64位机器上你有一个64位的地址范围,一个指针将是8个字节。

仅仅为了完整性和历史利益,在64位世界中,长长types的大小有LLP64和LP64两种,主要是在Unixtypes的系统和Windows之间。 一个名为ILP64的旧标准也使得int = 64位宽。

微软维护LLP64,longlong = 64位,但长期保持在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

它将始终等于sizeof size_t。

在32位机器上这往往是4.在64位机器上这往往是8。