指针的大小是否与其指向的类型的大小相同,或指针总是具有固定大小?例如......
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指针会返回相同的大小?我问这个的原因是因为指针存储的是一个存储器地址,而不是它们各自存储地址的值。
答案 0 :(得分:70)
功能指针在X86计算机上可以具有非常不同的大小,从4到20字节,具体取决于编译器。所以答案是否定的 - 尺寸可能会有所不同。
另一个例子:采用8051程序,它有三个内存范围,因此有三种不同的指针大小,从8位,16位,24位,取决于目标所在的位置,即使目标的大小始终相同(例如char)。
答案 1 :(得分:67)
指针通常具有固定的大小,例如。在32位可执行文件上,它们通常是32位的。有一些例外,比如旧的16位窗口,当你不得不区分32位指针和16位......通常可以非常安全地假设它们在现代桌面操作系统的给定可执行文件中是统一的
编辑:即便如此,我强烈建议您不要在代码中进行此假设。如果你要写一些绝对必须有一定尺寸指针的东西,你最好检查一下!
功能指针是一个不同的故事 - 有关详细信息,请参阅Jens' answer。
答案 2 :(得分:14)
在32位机器上,指针的大小是32位(4字节),而在64位机器上则是8字节。无论他们指向哪种数据类型,它们都有固定的大小。
答案 3 :(得分:8)
回答你的其他问题。指针的大小和指向的大小无关。一个很好的比喻是将它们视为邮政地址。房屋地址的大小与房屋的大小无关。
答案 4 :(得分:8)
在同一架构上,指针的大小并不总是相同。
您可以阅读更多关于“near”,“far”和“huge”指针的概念,就像指针大小不同的情况一样...
http://en.wikipedia.org/wiki/Intel_Memory_Model#Pointer_sizes
答案 5 :(得分:2)
它们在字可寻址机器上可能不同(例如,Cray PVP系统)。
今天的大多数计算机都是字节可寻址的机器,其中每个地址指的是一个字节的内存。在那里,所有数据指针通常都是相同的大小,即机器地址的大小。
在word-adressable机器上,每个机器地址都指的是一个大于一个字节的字。在这些上,指向一个存储器字节的(char *)或(void *)指针必须包含一个字地址加上一个字节偏移量。
http://docs.cray.com/books/004-2179-001/html-004-2179-001/rvc5mrwh.html
答案 6 :(得分:0)
指针的大小是系统保存唯一内存地址所需的大小(因为指针只保存它指向的地址)
答案 7 :(得分:0)
最近遇到这样的情况,TI C28x板可以具有sizeof指针== 1,因为这些板的字节为16位,而指针大小为16位。为了使事情更加混乱,它们还具有 22位的远指针。我不太确定远指针的大小是多少。
通常,DSP板可以具有奇怪的整数大小。
因此,如果您在怪异的地方看,指针大小在2020年仍然可能很奇怪