指针的大小是多less?
指针的大小与指向它的types的大小是一样的,还是指针总是有固定的大小? 例如…
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";
这会是什么结果呢? 如果sizeof(xPtr)
返回4, sizeof(yPtr)
返回1,还是2个指针实际返回相同的大小? 我问这个的原因是因为这些指针正在存储一个内存地址而不是它们各自存储地址的值。
指针通常有一个固定的大小,例如。 在一个32位的可执行文件,他们通常是32位。 有一些例外,比如在旧的16位窗口中,当你必须区分32位指针和16位时…假设在现代桌面操作系统的一个给定的可执行文件中它们将是统一的。
编辑:即使如此,我强烈build议不要在代码中做这个假设。 如果你要写一些绝对必须有一定大小的指针,你最好检查一下!
函数指针是一个不同的故事 – 请参阅Jens的更多信息的答案 。
函数指针可以有非常不同的大小,从X86机器上的4到20字节,取决于编译器。 所以答案是否定的 – 大小可以变化。
另一个例子:取一个8051的程序,它有三个内存范围,因此有三个不同的指针大小,从8位,16位,24位,取决于目标所在的位置,即使目标的大小总是相同的(如字符) 。
在32位机器上,sizeof指针是32位(4个字节),而在64位机器上是8个字节。 无论指向哪种数据types,它们都具有固定的大小。
指针在相同的架构上并不总是相同的大小。
你可以阅读更多关于“近”,“远”和“巨”指针的概念,就像指针大小不同的例子一样。
http://en.wikipedia.org/wiki/Intel_Memory_Model#Pointer_sizes
回答你的其他问题。 指针的大小和它指向的大小没有关系。 一个很好的比喻就是把它们看成是邮政地址。 房子的大小与房子的大小没有关系。
指针的大小是系统为保存唯一的内存地址所需的大小(因为指针只保存它指向的地址)
它们在可寻址的机器上可能不同(例如,Cray PVP系统)。
今天的大多数计算机都是字节可寻址的机器,其中每个地址指的是一个字节的内存。 在那里,所有的数据指针通常是相同的大小,即机器地址的大小。
在可寻址的机器上,每个机器地址指的是大于一个字节的字。 在这些内存中,(char *)或(void *)指向内存字节的指针必须包含字地址加上字节偏移量。
http://docs.cray.com/books/004-2179-001/html-004-2179-001/rvc5mrwh.html