1.定长管理
定义一个二维数组每行放固定长度的字节,删除的话首字节用/0代替,缺点,效率低空间利用率低,不方便管理,每次进行删除或增加操作都要便利数组。
2.变长管理
3.可以定义一个多维数组,例如10000个字符串的增删查改
[0][5][5]hellow [0][2][5]herld [0][6][6]printf
假定这三个字符串空间连续。则用第一个标志位表示空间是否已用,第二个标志位表示用了多少,第三个标志位表示总共多少,例如第二段字符串herld,0表示已用,2表示用了两个字节,5表示共5个字节,如果此时有三个字节要存放则可以放进该段空间,否则重新开辟空间,标志位可以定义一个二维数组来实现
Int g_flag[1000][3] 每个二维数组的元素存放三个字节
g_flag[0][0] 元素的第一个字节为标志是否已用
g_flag[0][1] 第二个字节表示用了多少
g_flag[0][2] 第三个字节表示总共多少
这个做的好处是效率高便于数据的增删改查
float ary[30]
ary ==》数组首地址,常量值
ary = &ary[0] ?? 1.地址一致 2.类型由使用场合决定,场合不一样解释也可能不一样
ary ==》 float[30] 一个数组
& ary[0]==》float*数组首地址
Int i=0;
(&i)[0]==》i做数组首地址用,i是什么类型就当做什么类型数组的首地址
数组:
空间连续切类型一致,物理地址同样连续,下标不进行检查,可以越界访问。
数组随机访问任何一个元素的速度是一样的,变量的地址一般是%4的地址主要是为了提高cpu的访问效率
nt main(int argc, char* argv[])
{
int ary[3] = {0};
int i = 123;
int n = 0;
int ary2[3][3] = {
1, 2, 3,
4, 5, 6,
7, 8, 9};
int ary3[2][2][2] = {
1, 2, 3,
4, 5, 6,
7, 8};
n = ary3[0][1][1];
printf("%p\r\n", ary2[2]);
printf("%p\r\n", ary2[2][2]);
printf("%p\r\n", ary2[-2][8]);
// n = ary2[0]; //int [3]
/*
type &ary[i][j] ==> (int)ary + sizeof(ary[0]) * i + sizeof(type) * j;
ary2[0] ary2[1]
*/
/*
ary ==>数组首地址,常量
ary == &ary[0] ? 1. 地址一致 2.类型(解释)不一样
(&i)[0] ==> &i当做数组首地址
数组:空间连续的,类型一致,下标无检查,随机访问快
寻址公式:
type &ary[1] ==> (int)ary + sizeof(type) * n;
(int)ary + sizeof(type) * n = 0x00401000;
sizeof(type) * n = 0x00401000 - (int)ary;
n = (0x00401000 - (int)ary) / sizeof(type);
*/
n = ary[((int)&i - (int)ary) / sizeof(int)];
return 0;