Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 数组和列表之间的区别_C - Fatal编程技术网

C 数组和列表之间的区别

C 数组和列表之间的区别,c,C,数组和列表之间的区别是什么?虽然在C中没有类似于列表的东西,但您肯定可以谈论链表的实现 数组:随机访问,预定义大小。 链表:顺序访问,运行时大小 其他语言,比如Python,可能内置了lists和arrays,它们的含义可能不同 下面的有用评论: 您可以添加数组列表。列出哪些内部数组在需要时加倍,在仅满1/4时减半。这为添加、删除、获取(指数)摊销提供了O(1)– Python的列表不是链表。Pythonlist和array之间的区别在于list可以存储任何东西,而array只能存储基元类型(i

数组和列表之间的区别是什么?

虽然在
C
中没有类似于
列表的东西,但您肯定可以谈论链表的实现

数组:随机访问,预定义大小。
链表:顺序访问,运行时大小

其他语言,比如Python,可能内置了
list
s和
array
s,它们的含义可能不同

下面的有用评论:


您可以添加数组列表。列出哪些内部数组在需要时加倍,在仅满1/4时减半。这为添加、删除、获取(指数)摊销提供了O(1)–


Python的
列表
不是链表。Python
list
array
之间的区别在于
list
可以存储任何东西,而array只能存储基元类型(
int
float
,等等)

> C.中没有标准列表,C++中有这样的东西,它是用.< /p>实现的。 主要区别在于数组具有随机访问权-您可以在
O(1)
时间内访问数组的任何成员(即,如果
a
是一个数组,
a[4]
),并且在编译时具有预设的大小。链表具有顺序访问-要访问元素,您必须在列表中循环,直到找到所需的元素(即,如果
b
是链表,要找到
b
中的第5个元素,您必须遍历元素0、1、2、3和4),并且大小可以动态增长和收缩,数组是一个固定大小的连续存储区域,包含多个对象,一个接一个。这个数组是一个“对象”,其含义与C赋予单词的含义相同——基本上只是一些表示某物的内存。对象只能是
int

可以稍微区分阵列对象和阵列类型。人们通常使用数组对象,这些对象是通过
malloc
分配的,并通过指向第一个元素的指针使用。但是对于不同大小的数组,C也有特定的类型,对于可变长度数组,其大小在创建时设置。VLA有一个稍微有点误导性的名称:大小只是“变量”,因为它在编译时不是固定的。它不能在对象的生命周期内更改

所以,当我说一个数组是固定大小的时候,我的意思是数组一旦创建,大小就不能改变,这包括VLA。有一个
realloc
,它在逻辑上返回指向替换旧数组的新数组的指针,但有时可以返回传入的相同地址,同时更改了数组的大小
realloc
对内存分配进行操作,而不是通常对数组进行操作

这就是数组。C编程语言没有定义任何称为列表的东西。无法将定义良好的事物与未定义的事物进行比较;-)通常“list”表示a,但在某些上下文或其他语言中,它表示其他事物


就这一点而言,在其他语言中,“array”可能意味着其他东西,尽管我不能马上想到一种语言,它的意思与C数组有什么不同

如果您的问题实际上与C无关,并且是一个与语言无关的数据结构问题,“数组和链表之间的区别是什么?”,那么这是一个重复的问题:


链接数据结构的一个经常被低估的特点是,您可以在内存高度碎片化的情况下使用它们,因为元素之间没有连续的内存保证。例如,您可以有100MB的可用空间,但只能说最大运行长度为10MB的可用内存。在这种情况下,您只能创建一个大小为10MB的数组,但可能会创建一个更大的链表,因为您可以使用每一次足够大的可用内存运行来包含单个节点

  • 对于数组,它有一个固定的大小,就像我们写的,newint[100] 但这个列表并没有固定的大小……它可以继续下去

  • 在列表中插入和删除要比在数组中容易 原因:对于链表,我们可以简单地使用来更改要插入和删除的指针,但是对于数组,插入和删除需要shiftRight和shiftLeft

  • 链表使用虚拟头节点,以避免插入空列表或从单位大小列表中删除最后一个节点的特殊情况;并且,它使用双链接允许在两个方向上进行迭代。当然,成本是容纳虚拟节点所需的额外空间(最小成本),以及每个节点通常的下一个链接之外的额外上一个链接(更重要的成本)。 在数组中,我们可以借助它的随机访问进行添加

  • 在链表中,对尾部节点的引用只是header.prev,这使我们能够在固定时间内追加到列表中(无需迭代查找尾部引用,也无需维护单独的尾部引用)。 但是在数组中,我们需要在插入之前重新调整数组的大小

  • 与链表不同,数组具有实现随机访问的灵活性

  • 链表有如下问题:

    它会为我们正在使用的指针消耗额外的内存

    数组中O(n)而不是O(1)的时间复杂度

    反向遍历对于单链表是困难的,如果我们使用双链表,另一个指针意味着更多的额外内存存储

    堆限制也是如此!仅当堆中有可用空间时才分配内存。如果内存不足,则不会创建内存

    数组存在如下问题:

    内存浪费或不足的机会


    希望这有帮助!:)

    数组只有相似的数据类型(即)