指针的大小是多少?

MGZ*_*ero 56 c++ pointers sizeof

指针的大小是否与其指向的类型的大小相同,或者指针总是具有固定大小?例如...

int x = 10;
int * xPtr = &x;
char y = 'a';
char * yPtr = &y;

std::cout << sizeof(x) << "\n";
std::cout << sizeof(xPtr) << "\n";
std::cout << sizeof(y) << "\n";
std::cout << sizeof(yPtr) << "\n";
Run Code Online (Sandbox Code Playgroud)

这会是什么输出?会sizeof(xPtr)返回4并sizeof(yPtr)返回1,或者2指针实际上会返回相同的大小吗?我问这个的原因是因为指针存储的是存储器地址而不是它们各自存储的地址的值.

Jen*_*ens 72

功能指针可以具有非常不同的大小,在X86机器上可以是4到20字节,具体取决于编译器.所以答案是否定的 - 尺寸可能会有所不同.

另一个例子:采用8051程序,它有三个内存范围,因此有三种不同的指针大小,从8位,16位,24位,取决于目标所在的位置,即使目标的大小始终相同(例如char) .

  • 谢谢,我甚至没想过考虑功能指针. (4认同)
  • @Jay:根本不是真的.`sizeof(p)`可以为不同类型的指针提供不同的结果. (4认同)
  • @Jay这不是MSC-具体:所有C++编译器支持多重继承调用有一个成员函数指针何时调整对象的指针,并且因此提供适当的设施,以计算出正确的在运行时间偏移.许多编译器通过保存所需信息的结构实现成员函数指针.我所知道的唯一例外是Digital Mars:它生成一个执行对象指针调整的thunk,而成员函数指针则指向此存根代码.这允许**所有**指针的大小相同. (3认同)
  • 抱歉,我说得不清楚和具体。在特定的 x86 机器上,指针大小不会变化。在不同的体系结构或编译器上,指针大小可能不同。使用“变化”的严格定义时要非常小心。 (2认同)
  • @Jay指向成员函数的指针在转换时可以改变它的大小([指向成员函数的指针是非常奇怪的动物](http://blogs.msdn.com/b/oldnewthing/archive/2004/02/09/70002的.aspx)). (2认同)

Nat*_*one 70

指针通常具有固定的大小,例如.在32位可执行文件上,它们通常是32位的.有一些例外,比如旧的16位窗口,当你不得不区分32位指针和16位......通常可以非常安全地假设它们在现代桌面操作系统的给定可执行文件中是统一的.

编辑:即便如此,我强烈建议不要在你的代码中做出这个假设.如果你要写一些绝对必须有一定尺寸指针的东西,你最好检查一下!

函数指针是一个不同的故事 - 请参阅Jens的回答以获取更多信息.

  • 不是这样,即使在同一台机器上,指针大小也可能不同 (5认同)
  • @ cf16他们可以,但我的回答只断言对于现代桌面操作系统,即Win32/64,Linux ......你能给我一个例子,说明它在其中一个系统上有所不同吗? (2认同)

pee*_*ush 15

在32位机器上,指针的大小是32位(4字节),而在64位机器上则是8字节.无论他们指向哪种数据类型,它们都具有固定的大小.

  • @Rick它是关于它被编译的字大小,而不是关于它运行的机器,所以如果它是为32位编译的,那么它在64位机器上将是32位,这使得原始答案不正确。 (3认同)
  • 在64位计算机上的32位可执行文件呢? (2认同)

Jay*_*Jay 8

回答你的另一个问题.指针的大小和指向的大小无关.一个很好的比喻是将它们视为邮政地址.房屋地址的大小与房屋的大小无关.


Sou*_*oti 8

在同一架构上,指针的大小并不总是相同.

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

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