C-结构与指针阵列的阵列



当我继续学习C语言时,我感到怀疑。这是使用每个元素是struct的数组与使用每个元素的数组之间的差异,其中每个元素都是指向相同类型的struct的指针。在我看来,您可以平等地使用两者(尽管在指针中,您必须处理内存分配)。有人可以解释我在哪种情况下最好使用一个或另一种?

谢谢。

结构和指针的数组阵列是组织内存的不同方法。

结构的数组具有以下强度:

  • struct s *p = calloc(n, sizeof(*p));在一个步骤中动态分配此类数组很容易。
  • 如果数组是封闭结构的一部分,则根本不需要单独的分配代码。本地和全局阵列也是如此。
  • 阵列是内存的连续块,可以轻松地将指向下一个元素的指针计算为struct s *prev = p - 1, *next = p + 1;
  • 访问数组元素成员在存储器中近距离时可能会更快,从而提高了缓存效率。

他们也有缺点:

  • 数组的大小必须明确传递,因为从指针到数组的指针没有办法。
  • 表达式 p[i].member会生成乘法,如果结构的大小不是2的力量,则在某些架构上可能是昂贵的。
  • 更改元素的顺序是昂贵的,因为它可能涉及复制大量内存。

使用一系列指针具有以下优点:

  • 可以通过分配额外的元素并将其设置为NULL来确定数组的大小。该约定用于提供给main()函数的命令行参数的argv[]数组。
  • 如果未使用上述约定,并且分别传递元素的数量,则可以使用NULL指针值来指定缺失的元素。
  • 只要移动指针就可以很容易地更改元素的顺序。
  • 可以使多个元素指向相同的结构。
  • 重新定位数组很容易,因为只有指针的数组才需要重新分配,可选地保留单独的长度和尺寸数量以最大程度地减少重新位置。增量分配也很容易。
  • 表达式p[i].member会生成一个简单的移动和额外的内存访问,但可能比结构数组的等效表达式更有效。

和以下缺点:

  • 分配和释放此间接阵列更麻烦。需要额外的循环来分配和/或初始化阵列指向的结构。
  • 对结构元素的访问涉及额外的内存间接。如果在同一函数中访问了多个成员,但并非总是如此。
  • ,编译器可以为此生成有效的代码。
  • 指向相邻结构的指针不能从指向给定元素的指针中得出。

edit :正如大卫·鲍林(David Bowling)所暗示的那样,可以通过一方面分配一系列结构和指向第一个元素的单独的指针来结合两种方法的某些优点大批。这是实现排序顺序的方便方法,甚至是具有单独的指针数组的多个伴随的排序订单,例如数据库索引。

最新更新