本文主要是介绍【专栏】数据结构和算法之美-为什么很多编程语言中的数组都是从 0 开始的,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
学习笔记
-
数组的特征
1.线性表
数据排成像一条线一样的结构,数据之间只是简单的前后关系。除了数组是一种线性表结构外,链表、队列和栈也是。与之对应的像二叉树、堆、图等就是非线性表。
2.使用连续的内存空间
3.存储相同类型数据
特征2和3为随机访问到数组里的元素提供了可能,就是任意下标指示的元素可以直接访问到,寻址公式a[i]_address = base_address + i*data_type_size; -
数组和链表区别
1.数组支持随机访问,根据下标随机访问的时间复杂度为O(1);
2.数组低效的”插入“和”删除“,最好情况时间复杂度是O(1)、最坏情况时间复杂度是O(n)、平均时间复杂度是O(n).如果不考虑数组排序,要在数组K处插入元素时,只需要移动K处的元素到数组末尾,
然后把新元素存放在K处。 -
警惕数组的访问越界问题
下面代码会陷入死循环,如果编译环境使用的堆栈,它的地址是从高地址向低地址方向增长,那么啊数组arr下标3位置的单元就是变量i,所以当for循环到第四次时,通过arr[3]=0 把变量i的值写成了0。
void iTestArrOutOfBoundary(void)
{int i = 0;int arr[3] = {0};for (; i <= 3; i++){arr[i] = 0; /*arr[3] = 0 means i = 0;*/printf("Hello world!\n");}
}
void main(void)
{iTestArrOutOfBoundary();return;
}
这篇关于【专栏】数据结构和算法之美-为什么很多编程语言中的数组都是从 0 开始的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!