3.17数组知识补课

版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/SilenceCoder/article/details/21424917

1.定长管理

定义一个二维数组每行放固定长度的字节,删除的话首字节用/0代替,缺点,效率低空间利用率低,不方便管理,每次进行删除或增加操作都要便利数组。

2.变长管理

3.可以定义一个多维数组,例如10000个字符串的增删查改

[0][5][5]hellow [0][2][5]herld [0][6][6]printf

假定这三个字符串空间连续。则用第一个标志位表示空间是否已用,第二个标志位表示用了多少,第三个标志位表示总共多少,例如第二段字符串herld0表示已用,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;

猜你喜欢

转载自blog.csdn.net/SilenceCoder/article/details/21424917