首页  >  文章  >  后端开发  >  C 中所有指针的大小都相同吗? 令人惊讶的答案。

C 中所有指针的大小都相同吗? 令人惊讶的答案。

Patricia Arquette
Patricia Arquette原创
2024-10-26 19:13:02927浏览

 Do All Pointers in C   Have the Same Size?  The Surprising Answer.

C 中所有指针的大小都相同吗?

在世界上在C语言中,指针在管理内存和访问数据方面起着至关重要的作用。但它们都遵守相同的尺寸限制吗?令人惊讶的是,答案既是肯定的,也是否定的。

C 标准的立场

虽然很容易假设所有指针由于其作为内存地址的固有性质而共享相同的大小,但 C 标准明确描述了该假设成立的某些情况:


  1. void 与 char ([basic.compound]/5)
  2. T const、T volatile 和 T const volatile 大小相同 与 T 大小相同。这是因为同一类型的 cv 限定版本表现出布局兼容性,并且指向布局兼容类型的指针拥有等效的值表示 ([basic.compound]/3)。

  3. 同样,指针具有相同底层类型的枚举类型共享相同的大小 ([dcl.enum]/9)。

    实际情况< ;/p>

    实际上,指向类类型的指针通常遵循相同的大小限制。原因在于标准要求即使类类型不完整,仍然可以获得其指针类型的大小。这对编译器施加了限制,迫使它们在不完全了解类的内部结构的情况下确定指针类型的大小。

    虽然编译器保留引入大小差异的灵活性,例如根据类前缀区分指针,这种做法在现实场景中并不常见。

    在大多数情况下,以下大小等式在实践中也成立:< ;/p>


    • 指向函数类型的指针具有相同的大小。
    • 指向数据成员的指针具有相同的大小。
      指向函数成员的指针具有相同的大小。

    这些相等性源于重新解释某些指针类型之间的转换而不会丢失信息的能力。虽然编译器在技术上可以引入填充变化,但这样做没有实际的理由。

    规则的例外

    但是,在具有“近”和“远”指针的分段架构中,您可能会遇到大小差异。这种与一般规则的背离是一个值得注意的例外。

    总之,虽然 C 标准允许指针大小变化的可能性,但在实际应用中,大多数指针都符合相同的尺寸限制。这种一致性简化了内存管理并增强了代码可读性。

  4. 以上是C 中所有指针的大小都相同吗? 令人惊讶的答案。的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn