指针可以有不同的大小吗?

Can pointers be of different sizes?

本文关键字:指针      更新时间:2023-10-16

这个答案伴随着一个有趣的陈述——"在int*小于char*的机器上"。(让我们排除指向函数的指针)

指向不同类型的指针可能有不同的大小吗?为什么这是有用的?

是的,完全有可能。在某些机器上,指向字节的指针包含两个值:指向包含该字节的内存字的WORD地址的指针,以及给出该字节在字中的位置的"字节索引"。例如,在32位机器上,"字节索引"是0..3。

这将比"int *"需要更多的存储空间,"int *"只是一个指向相关单词的指针。

在字寻址机器上,char*可能需要包含部分字信息,使其比int*大。

标准允许这样做,不排除在这样的硬件上实现(尽管现在比设计C89时更加罕见)。

language-lawyer标签意味着您正在询问c++及其兼容的实现,而不是某些特定的物理机器。

我不得不引用整个标准来证明它,但简单的事实是,它不能保证sizeof(T*)对任何T的结果,并且(作为推论)不能保证sizeof(T1*) == sizeof(T2*)对任何T1T2)。

是的,指针不能保证具有相同的大小,尽管在大多数现代体系结构中,它们实际上是相同的。

当涉及到数据指针和函数指针时,这一点很有用。过去,函数指针(用于跳转到可执行代码中的特定部分)需要所谓的"远指针",它比数据指针宽。

我可以想象一台机器,它是有意义的假设int数组的内存需求将远远小于char数组的内存需求。

例如,可以指定一个实现不使用超过10个动态分配的整数,但可以自由分配多个char数组。在这种情况下,一个字节可以满足int*,而char*需要四个字节或更多。