数组

来源:互联网 发布:64式轻坦性能数据 编辑:程序博客网 时间:2024/06/09 23:25

环境:VC6

如何识别数组

  • 比例因子寻址
  • 循环处理(通常在商业项目中,循环和数组都是成对在一起的)

一维数组

#define NUM 32int main(int argc, char* argv[]){  int i;  int ary[NUM];  scanf("%d", &i);  printf("%p\r\n", ary[i]);  return 0;}

定义一个一维数组 type ary[]ary[n] 的寻址公式可用以下伪代码表示:

(int)ary + sizeof(type)  * n

Debug版 和 Release版 使用公式的形式是一样的。从图中,可以判断数组的基址为 esp + 8ch + var_80

这里写图片描述

其中 +8ch 是对变量 var_80 的调整,不必过于在意。esp + 8ch + var_80 可以理解为变量 var_80 在栈中的位置。

二维数组

#define NUM 32int main(int argc, char* argv[]){  int i;  int j;  int ary[NUM][NUM];  scanf("%d", &i, &j);  printf("%p\r\n", ary[i][j]);  return 0;}

定义一个二维数组 type ary[M][N]ary[i][j] 的寻址公式可用以下伪代码表示:

公式一:      (int)ary + sizeof(type[N])*i         + sizeof(type)*j =>进一步转换为公式二:    (int)ary + sizeof(type)*(i*N + j)

在 Debug 版中,采用公式一进行数组寻址:

这里写图片描述

在 Release 版中,采用公式二进行数组寻址:

这里写图片描述

三维数组

#define NUM 8int main(int argc, char* argv[]){  int i = 1;  int j = 2;  int k = 3;  int ary[NUM][NUM][NUM];  scanf("%d", &i, &j, &k);  printf("%p\r\n", ary[i][j][k]);  return 0;}

定义一个三维数组 type ary[M][N][L]ary[i][j][k] 的寻址公式可用以下伪代码表示:

公式一:  (int)ary + sizeof(type[N][L])*i               + sizeof(type[L])*j                   + sizeof(type)*k=>进一步转换为公式二:    (int)ary + sizeof(type)*(L*(i*N + j) + k)

在 Debug 版中,采用公式一进行数组寻址:

这里写图片描述

在 Release 版中,采用公式二进行数组寻址:

这里写图片描述

其他

数组在内存中的分布

无论在栈还是在全局中,数组从低地址往高地址排列

原创粉丝点击