扩展的数组类型

扩展的数组类型:

1.  普通数组中,我们申请一连续的内存块,其中存放相同类型的数组元素,这样每个元素占用的内存相同,每个元素在数组中的偏移地址也可以通过一个等差公式计算出来,如:

int array[10],这样元素的偏移地址依次为0,4,8…当知道起始地址array时,我们可以通过(array + 4*i)获得每个元素的地址,进而获得每个元素的值

2.  扩展的数组类型中,我们申请一连续的内存块,其中存放不同类型的数组元素,这样每个元素占用的内存长度是不同的,每个元素在数组中的偏移地址也不再是一个等差的距离,通常我们使用扩展数组时,我们需要保存的数据的数据类型是已知的,我们统计好每个数据的数据名,数据类型,数据长度并通过某种方式为每个数据分配一个偏移地址,定义一个描述性结构体,为每个数据配置一个描述性结构体,这样我们可以计算所有的数据需要的总内存大小,申请一块内存空间用来存放之前统计的所有数据,现在我们已经清楚这块内存那部分存放什么数据了,进一步,我们就可以根据数据名为其赋值和读取需要数据了。

通常这个描述性结构体定义方式如下:

typedef struct Data_Info{

       char name[];

       int   type;

       int   len;

       int   arr;

}Data_Info

通过分析我们可以发现,在扩展数组中,我们需要:

1)  数据定义:

    a)  分析我们要存放的数据有哪些,需要知道要存放的数据的数据名,数据长度,数据类型

    b)  定义一个描述性的数据结构,为要保存的每个数据配置一个这样的描述性数据结构,记录这个数据的数据名,数据类型,数据长度,并通过某种方式计算每                             个数据的偏移地址,计算所有数据的总大小(通常我们用一个结构体数组保存这些描述性结构体)

    c)  申请一个连续的内存空间,用来存放所有的数据

2)  数据赋值

    a)  通过数据名检索要这个数据对应的结构体,进而获知这个数据的数据长度及偏移地址

    b)  用memcpy()操作这个数据所在的内存块,即将要写入的数据复制到这个内存块中

3)      数据读取

    a)  通过数据名检索到要读取的数据对应的结构体,进而获知这个数据的数据长度及偏移地址

    b)  用memcpy()操作这个数据所在的内存块,即将这块内容复制出来进行读取

注:

使用扩展的数据类型时,这个描述性的结构体要先于存放数据的内存产生,这样我们知道需要多大内存,那部分内存放那个数据后,先按照我们的约定申请内存,进行赋值和读取,可以称之为先定规则,在操作数据。

 

posted @ 2012-11-03 17:17  liuhao2638  阅读(376)  评论(0)    收藏  举报