实际开发中,经常需要一次性存储多个数据,也许是考虑到提高程序员的开发效率,很多编程语言都提供了数组这种数据类型,比如 C、C++、Java、Golang。
数组可以一次性存储多个数据,所有数据连续存放在一整块内存空间中。以 C 语言的数组为例,比如说:
int num[5] = { 1,2,3,4,5 };
将 {1,2,3,4,5} 存储到 num 数组中,数据在内存中的存储状态如下图所示:
看到这张图,是否“似曾相识”呢?在我原创的数据结构教程中,第 2 章的《顺序表(顺序存储结构)详解》一节中,讲解“将 {1,2,3,4,5} 存储到顺序表中”时也用到了这张图。
直观上看,顺序表和数组存储数据的方式是一样的,都是将数据集中存放在一整块内存空间中。那么,顺序表和数组是一样的吗,又或者说,顺序表和数组之间的关系和区别是什么呢?
顺序表和数组的区别
顺序表是一种数据结构,更准确地说是一种线性存储结构,而数组是编程语言提供的一种数据类型,这是它们最本质的区别。
数组的功能很单一,它可以一次性存储多个数据,仅此而已。顺序表则不同,它表示的含义有两个方面:
- 存储结构上:数据存储在一整块内存空间中,数据元素之间紧挨着存放;
- 逻辑结构上:数据之间保持“一对一”的逻辑关系。
可以这么理解,和数组相比,顺序表还多表示了一层含义,即存储的数据之间具有“一对一”的逻辑关系。
总之,数组强调的仅仅是存储一组数据,而顺序表在保证存储一组数据的同时,还能存储数据之间“一对一”的逻辑关系。
顺序表和数组的关系
一句话可以概括它们之间的关系:数组是顺序表在实际编程中的一种实现方式。
也就是说,对于具有“一对一”逻辑关系的数据,使用顺序表存储它们时,多数人习惯用数组来实现。
当然,顺序表还有其它的实现方式,比如 C 语言中用指针实现、C++ 中用容器实现、Python 中用列表或者元组实现等等。
总结
网络上,很多人认为顺序表就是数组,或者数组就是顺序表等等,这些理解都是错误的、片面的。
数组是一种数据类型,专门用来存储一组数据;顺序表是一种存储结构,专门用来存储逻辑关系为“一对一”的一组数据。