前言:本文是用来记录自己学习数据结构与算法的笔记,写的不对的地方欢迎指正。
数组定义
数组是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
线性表:就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。
非线性表:比如二叉树、堆、图等。
数组的删除和插入
假设有一个数组,它的长度是n。我们现在要将一个数据插入到数组的第x个位置。那么为了将第x个位置空出来,这个数组需要将x~n这部分的数据全部向后移动一个位置。删除同理。
数组越界
在C语言中如果数组越界,根据寻址公式会定位到一块不属于数组的内存地址上,数组越界在C语言中是一种未决行为,编译器是不会报任何错误的。这就会造成程序出现莫名其妙的bug。
在iOS中如果发生数组越界情况编译器会为我们抛出异常。
数组容器
在高级语言中会有很多数组容器,比如OC的可变数组和不可变数组。那么他们都有什么特点呢。
C数组:
- 可以存储int等基础类型
- 不支持动态扩容
NSArray:
- 不能存储基础类型
- 不支持动态扩容
NSMutableArray:
- 不能存储基础类型
- 支持动态扩容
- 但是动态扩容是需要消耗性能的,所以尽量初始化数组的时候指定数组长度。
寻址公式
假设有一个长度为n的数组,里面的数据类型为int,首个元素的内存地址是1000,那么求第k个元素的内存地址:
address_k = first_address + k * data_size = 1000 + k * 4;
为什么数组从0开始计数
1,因为第一个人就是这么干的。
2,使用寻址公式计算下标和偏移的时候方便。
网友评论