相同尺寸的char*
,int*
,long*
甚至long long*
(在给定平台上)?
答案 0 :(得分:49)
虽然在我们经常遇到的平台上,但它们不能保证大小相同。
C 2011 online draft:
6.2.5类型
...
28指向void
的指针应具有与a相同的表示和对齐要求 指向字符类型的指针。 48)同样,指向合格或非限定版本的指针 兼容类型应具有相同的表示和对齐要求。所有 指向结构类型的指针应具有相同的表示和对齐要求 彼此相同。所有指向联合类型的指针都应具有相同的表示形式 对齐要求彼此。指向其他类型的指针不必相同 表示或对齐要求。
48)相同的表示和对齐要求意味着可互换性 函数的参数,函数的返回值和联合的成员。
答案 1 :(得分:18)
不一定。该标准不保证sizeof(double*) == sizeof(int*)
。例如,假设处理器具有两个具有不同宽度的地址总线(如在一些哈佛架构处理器上),它可以具有不同大小的指针。
答案 2 :(得分:7)
在具有存储(分页)RAM和/或闪存的16位嵌入式处理器上,使用页面可能会导致指针大小不同 - 尽管这与它们指向的数据大小无关。
例如,飞思卡尔的HCS12处理器已经存储了闪存,数据指针都是16位。
但是,函数指针对于近指针是16位(对于与调用函数相同的页面中的代码,或者在未存储的闪存中),或者对于远指针(对于不同页面中的代码)是24位,并且包含页码在地址。
如果你想在分页闪存中存储常量数据,事情会很复杂,因为数据指针大小的限制,使用数据的函数必须与被访问的数据位于同一页面。
可以想象,具有存储区RAM的16位处理器对于近端和远端数据指针同样具有不同的大小。
答案 3 :(得分:7)
请注意C标准所说的内容 - 正如John Bode所引用的那样。另请注意,C标准根本没有说明函数指针的大小。
POSIX标准规定了一些额外的要求:
2.12.3指针类型
所有函数指针类型应与void指向的类型指针具有相同的表示形式。将函数指针转换为void *不得改变表示。这种转换产生的void *值可以使用显式转换转换回原始函数指针类型,而不会丢失信息。
注意:ISO C标准不要求这样做,但它是POSIX一致性所必需的。
答案 4 :(得分:4)
在C或C ++ ISO标准中都没有这样的保证,但在实践中,我还没有看到一个不存在的平台。
请注意,无论如何,reinterpret_cast
指向另一个的void*
指针往往会导致U.B.,但有一些例外(POD)unsigned char*
和{{1}}。任何工会技巧都会如此。所以显而易见的问题是:你为什么要关心?
答案 5 :(得分:4)
使用Watcom C编程x86实模式时,您可以使用16位近指针和32位远指针的混合内存模型。
答案 6 :(得分:2)
在DOS保护模式下,函数指针和数据指针的长度可能不同,因为数据可能位于不同的部分。
答案 7 :(得分:0)
通常是的,所有指向任何东西的指针,无论它们指向int还是long或字符串,还是字符串或函数数组,都指向单个内存地址,它在机器上的大小相同。这是因为机器上的Processer有一个地址寄存器,这些指针被加载到这个地址寄存器中,并且该地址寄存器的大小控制着指针的大小。
唯一的例外可能是旧的Intel 8088 16位机器,其中有两个步骤来确定内存地址,涉及16位段指针(在1MByte地址中识别出64K块内存)空间),然后是第二个16位存储器地址,以识别该段内的特定存储器地址。然后组合这两个16位地址以获得完整的20位存储器地址。在那种情况下,我想,有可能区分各个16位地址和组合的20位地址。