4
随着我继续学习C语言,我有了疑问。使用数组中的每个元素是一个结构并使用一个数组中的每个元素都是指向相同类型的结构的指针之间的区别。在我看来,你可以同时使用两者(尽管在指针中你必须处理内存分配)。有人可以解释我在哪种情况下最好使用其中一种?结构体数组与指向结构体的指针数组
谢谢。
随着我继续学习C语言,我有了疑问。使用数组中的每个元素是一个结构并使用一个数组中的每个元素都是指向相同类型的结构的指针之间的区别。在我看来,你可以同时使用两者(尽管在指针中你必须处理内存分配)。有人可以解释我在哪种情况下最好使用其中一种?结构体数组与指向结构体的指针数组
谢谢。
结构和指向结构的指针数组的数组是不同的方式来组织内存。结构的
阵列具有这些长处:
struct s *p = calloc(n, sizeof(*p));
分配动态这种阵列。struct s *prev = p - 1, *next = p + 1;
他们也有缺点:
p[i].member
产生一个乘法,这可能是在某些体系结构昂贵,如果结构的大小不是2使用指针的阵列具有以下优点:
NULL
来确定。该惯例用于提供给main()
函数的argv[]
命令行参数数组。p[i].member
生成一个简单的移位和额外的存储器访问,但可能比结构数组的等效表达式更有效。和以下缺点:
EDIT:作为暗示由David保龄球,可以通过分配的结构的一方面的阵列,并且指向所述第一数组的元素的指针的一个单独的阵列结合一些的这两种方法的优点。这是一种实现排序顺序的方便方法,甚至可以使用单独的指针数组(如数据库索引)实现多个伴随排序顺序。
一个示例:使用'qsort'对指针数组进行排序可能比对结构数组进行排序更快(如果结构体非常大),因为交换两个指针会比交换两个结构更快。 – user3386109
^OTOH,在结构数组上的顺序传递将更加缓存友好,并且不需要在每一步都有额外的间接寻址。 – StoryTeller
我不认为这个问题过于宽泛:每种方法的优缺点都存在某种程度的个人意见,但问题在于真正的询问,并列出两种解决方案的相关特征似乎是可行的。 – chqrlie