基本定义

数组是n(n>1)个具有相同特性数据元素组成的地址连续的有限序列。数组采用随机存取,可以视为线性表的推广,其中数据元素可以是一个数据结构,例如多维数组的数据元素是一个线性表。

数组的存储方式

二维数组

  • 行优先存放:同一行的元素优先放在连续的地址空间
    LOC(i,j) = a + (in+j)L,其中数组的下标都是从0开始的。
  • 列优先存放:同理

n维数组

  • 使用映象函数,即位置和坐标转换的函数。LOC(j1,j2,j3,…,jn) = a + Σciji,其中ci是第i维地址系数,用于提高运算速度,j是第i维坐标
    推导方法:n维数组由b1个n-1维数组构成,以此类推,即:cn = L, cj-1 = cj * bj

对于特殊的矩阵:三对角矩阵、上/下三角矩阵计算坐标和顺序位置的关系? 特殊矩阵实际上是二维数组,但是压缩存储时不会直接按照上述方法中挨个填入,因此可以使用方程组或者直接按规律推导某元素前面有多少个,详见下一章"特殊矩阵"

数据结构实现

顺序实现

typedef struct _array{
  Elemtype * base;//数组元素基址
  int dim;//维度
  int * bounds;//各维度元素个数存放基址
  int * constant;//各维度地址系数存放基址  
}

拓展:C语言实现参数个数可变函数

  • va_list类型:存放变参
  • va_start(va_list, n):从本函数参数中读取变参到va_list变参表中
  • va_arg(va_list, int):以int类型读取从va_list中读取一个参数,每读取一个下次读取会自动读下一个
  • va_end(va_list):结束读取,与va_start配合使用