是char*,int*,long*甚至是long long*同样大小的(在给定的平台)?
Meh*_*ari 18
不必要.该标准不保证sizeof(double*) == sizeof(int*).例如,假设处理器具有两个具有不同宽度的地址总线(如在一些哈佛架构处理器上),它可以具有不同大小的指针.
在具有存储(分页)RAM和/或闪存的16位嵌入式处理器上,页面的使用可能导致指针具有不同的大小 - 尽管这与它们指向的数据的大小无关.
例如,在飞思卡尔的HCS12处理器上,它有闪存,数据指针都是16位.
但是,函数指针对于近指针是16位(对于与调用函数相同的页面中的代码,或者在未存储区的闪存中),或者对于远指针(对于不同页面中的代码)是24位,将页码包含在地址中.
如果您想在分页闪存中存储常量数据,则事情很复杂,因为数据指针大小的限制,使用数据的功能必须与访问的数据位于同一页面中.
可以想象,具有存储区RAM的16位处理器对于近端和远端数据指针同样具有不同的大小.
请注意C标准所说的内容 - 正如John Bode所引用的那样.另请注意,C标准根本没有说明函数指针的大小.
POSIX标准规定了一些额外的要求:
2.12.3指针类型
所有函数指针类型应与void指向的类型指针具有相同的表示形式.将函数指针转换为void*不得改变表示.这种转换产生的void*值可以使用显式转换转换回原始函数指针类型,而不会丢失信息.
注意:ISO C标准不要求这样,但它是POSIX一致性所必需的.
在 C 或 C++ ISO 标准中没有这样的保证,但在实践中,我还没有看到一个平台不支持。
需要注意的是不论这一点,reinterpret_cast“荷兰国际集团一个指向另一个会往往不是导致UB,除了少数例外(void*,并unsigned char*为荚)。任何工会技巧也是如此。所以显而易见的问题是:你为什么要关心?