扩展的数组类型
扩展的数组类型:
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()操作这个数据所在的内存块,即将这块内容复制出来进行读取
注:
使用扩展的数据类型时,这个描述性的结构体要先于存放数据的内存产生,这样我们知道需要多大内存,那部分内存放那个数据后,先按照我们的约定申请内存,进行赋值和读取,可以称之为先定规则,在操作数据。
浙公网安备 33010602011771号