精华内容
下载资源
问答
  • C++三维数组寻址过程

    2018-08-23 11:45:42
    问题:定义一个三维数组int a[rows][cols][comps],如何从int* p0 = &a[0][0][0]寻址到相应的int* p = &[i][j][k]. 解答:寻址先后顺序:x轴->y轴->z轴。沿x轴寻址结果为i * (cols *...

    1. 寻址原理

    问题:定义一个三维数组int a[rows][cols][comps],如何从int* p0 = &a[0][0][0]寻址到相应的int* p = &[i][j][k].
    解答:寻址先后顺序:x轴->y轴->z轴。沿x轴寻址结果为i * (cols * comps);在沿y轴寻址结果为i * (cols * comps) + j * comps; 最后再沿z轴寻址结果为i * (cols * comps) + j * comps + k

    2.验证代码

    #include <iostream>
    using namespace std;
    
    int main()
    {
        const int rows = 2;
        const int cols = 3;
        const int comps = 4;
    
        const int i = 1;
        const int j = 2;
        const int k = 3;
    
        int a[rows][cols][comps];
        int *p0 = &a[0][0][0];
        int *p = &a[i][j][k];
        int idx = i * (cols*comps) + j * comps + k;
    
        cout << p0 + idx << " " << p << endl;
    
        system("pause");
        return 0;
    }
    展开全文
  • 二维数组和多维数组的本质及寻址方式      二维数组和多维数组的本质还是一维数组,一维数组是一个特殊的一维数组数组数组就是多维数组,这个数组的元素不是基本数据类型,而是数组。 ...

    二维数组和多维数组的本质及寻址方式

         二维数组和多维数组的本质还是一维数组,一维数组是一个特殊的一维数组。数组的数组就是多维数组,这个数组的元素不是基本数据类型,而是数组。

         int ary[5],float ary[5],double ary[5],这种数组称为基本类型数组。整形可以当元素,通过类比,数组也可以当元素。

         把一维数组作为元素的数组,称为二维数组。把二维数组作为元素的数组,称为三维数组。元素是几维元素,就是几维加一的数组,元素是 n 维数组,那就是 n+1 维数组。

         数组的数组,在生活中经常会遇到。例如学校考试之后,会记录学生的分数。放全班同学的分数用一维数组就可以。

         如果,学校同一年级,有 5 个班,这时,用一维数组是不够的,要用到二维数组,相当于 5 个一维数组构成了二维数组。

    在这里插入图片描述
         再举一个例子。小学用的作文本,一个作文单元格,视为一个元素,每一行构成了单元格的数组,一行有 20 个单元格,构成的数组是 ary[20]。

         一页有 15 行,基本元素为行,定义为一页,换算成单元格,构成的数组是 ary[20][10] ,二维数组。

          一本有 50 页,基本元素为页,定义为一个本,换算成单元格,ary[50][20][10] ,三维数组。

         以此类推……

    在这里插入图片描述
         最后举一个例子。更像多维数组结构的,是小学笔盒中的钢尺,它的 1 小格是 1 毫米,10 毫米是 1 厘米,10 厘米是 1 分米,10 分米是 1 米。

         尺子的排列结构和数组是一样的,顺序排列。毫米在顺序排列,相对于厘米而言,也在顺序排列,相对于分米而言,还在顺序排列。

         20 公分的钢尺,里面包含有两个元素,两个分米。只看分米,相当于1维数组。

         再看分米,1 分米相当于 10 厘米,分米是一个数组,厘米也是一个数组。

         再看厘米,1 厘米相当于 10 毫米。单一看,分米是一个数组,厘米是一个数组,毫米仍是一个数组。换而言之,20 公分的钢尺,也可称之为 200 毫米的钢尺。

    在这里插入图片描述
         通过写程序,调试,观察二维数组在内存中的分布

    #include <stdio.h>
    
    int main()
    {
      int ary[2][3] = {
        {1, 2, 3},  // ary[0]
        {4, 5, 6}   // ary[1]
      };
    }
    

         按 F10 ,进入单步调试,第一个元素 1, 2, 3 成功写入了内存

    在这里插入图片描述
         再按 F10,第二个元素 4, 5, 6 也成功写入了内存。通过观察框,可以看出,这两个元素相邻且连续,类型是一样的,都是放三个整形的数组。所以说,多维数组还是数组,满足数组的一切特性,以及寻址公式。

    在这里插入图片描述

    使用多维数组的注意点

          在设计上一般不会用到很多维的数组,在设计中如果出现,使用三维数组以上时,往往要考虑设计上出现了问题。

         一维表示线性,二维表示平面,三维表示立体。如果在程序中,根据业务要求,处理线性,平面,立体是可以理解的。

         四维表示时间,五维几乎 99% 的都不理解是做什么的。所以当发现必须要用三维数组以上解决问题时,先冷静一下,重新思考,肯定有更好的方法解决这个问题。

    二维数组和三维数组寻址公式

    二维数组寻址公式

         某类型二维数组,type ary[N][M] 。因为二维数组的元素是一维数组。根据数组这篇文章,讲解的一维数组寻址公式,类比得出。ary[x] 的地址是 (int)ary + sizeof(type[M])*x ,经过计算后,得到其元素一维数组的首地址。

          编写程序,求 ary[1] 的地址,通过调试和汇编代码验证公式。

    #include <stdio.h>
    
    int main()
    {
      int ary[2][3] = {
        {1, 2, 3},  // ary[0]
        {4, 5, 6}   // ary[1]
      };
    
      printf("%08x\r\n", &ary[1]);
      printf("%08x\r\n", (int)ary + sizeof(int[3])*1);
    }
    

         按 F10 进入单步调试,可以看到 ary 的首地址是 0019ff18,ary[1] 的首地址是 0019ff24

    在这里插入图片描述
          按 alt+8 进入反汇编模式,可以看到

    printf("%08x\r\n", &ary[1]);
    printf("%08x\r\n", (int)ary + sizeof(int[3])*1);
    

    对应的汇编代码是一致的。

    在这里插入图片描述
          编译执行,输出的结果就是 0019ff24

    在这里插入图片描述
         求 ary[x][y] 的地址。编译器并不知道它是二维数组,所以经过两次下标运算。第一次下标运算得到其元素一维数组的地址,第二次下标运算是针对一维数组的下标运算。所以 ary[x][y] 的寻址公式就是

    (int)ary + sizeof(type[M])*x + sizeof(type)*y 
    = (int)ary + sizeof(type)*M*x + sizeof(type)*y
    =(int)ary+sizeof(type)*(M*x + y)
    

         编写程序,求 ary[1][1] 的地址,通过调试和汇编代码验证公式。

    
    #include <stdio.h>
    
    int main()
    {
      int ary[2][3] = {
        {1, 2, 3},  // ary[0]
        {4, 5, 6}   // ary[1]
      };
    
      printf("%08x\r\n", &ary[1][1]);
      printf("%08x\r\n", (int)ary + sizeof(int[3])*1 + sizeof(int)*1);
    }
    

         按 F10 进入单步调试,可以看到 ary 的首地址是 0019ff18,ary[1][1] 的地址是 0019ff28。

    在这里插入图片描述
         按 alt+8 进入反汇编模式,可以看到

    printf("%08x\r\n", &ary[1][1]);
    printf("%08x\r\n", (int)ary + sizeof(int[3])*1 + sizeof(int)*1);
    

    汇编代码一致。

    在这里插入图片描述
          编译执行,输出的结果就是 0019ff28

    在这里插入图片描述

    三维数组寻址公式

         以此类推,type ary[L][N][M] = ……

         ary[x][y][z] 的地址是

    
    (int)ary + sizeof(type[N][M])*x 
    + sizeof(type[M])*y
    + sizeof(type)*z
    = (int)ary + sizeof(type)*N*M*x 
    + sizeof(type)*M*y
    + sizeof(type)*z
    = (int)ary + sizeof(type)*(N*M*x + M*y + z)
    = (int)ary + sizeof(type)*(M(N*x + y) + z)
    

         编写程序,求 ary[1][1][2] 的地址,通过调试和汇编代码验证公式。

    #include <stdio.h>
    
    int main()
    {
      int ary[2][3][4] = {
        {  // ary[0]
          {1, 2, 3, 4},  // ary[0][0]
          {4, 5, 6, 7},  // ary[0][1]
          {7, 8, 9, 0}   // ary[0][2]
        },
        {  // ary[1]
          {10, 20, 30, 40},  // ary[1][0]
          {40, 50, 60, 70},  // ary[1][1]
          {70, 80, 90, 10}   // ary[1][2]
        },
    };
    
      printf("%08x\r\n", &ary[1][1][2]);
      printf("%08x\r\n", (int)ary + sizeof(int[3][4])*1 + sizeof(int[4])*1 + sizeof(int)*2);
    }
    

         按 F10 进入单步调试,可以看到 ary 的首地址是 0019fed0,ary[1][1][2] 的值是 60(十六进制 3C),地址是 0019ff18

    在这里插入图片描述
         按 alt+8 进入反汇编模式,可以看到

    
    printf("%08x\r\n", &ary[1][1][2]);
    printf("%08x\r\n", (int)ary + sizeof(int[3][4])*1 + sizeof(int[4])*1 + sizeof(int)*2);
    

    汇编代码一致。
    在这里插入图片描述
         编译执行,输出的结果就是 0019ff18

    在这里插入图片描述

    更多精彩文章,关注公众号。想了解更多 C/C++ 或 网络安全知识,请关注公众号:大人物小城梦

    在这里插入图片描述

    展开全文
  • 数组寻址(一维和二维)

    千次阅读 2018-10-02 21:13:01
    #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main() { int a[3]={0,1,2}; printf("a=%d\n",a); printf("*a=%d\n",*a); printf("...a+...

     

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    	int a[3]={0,1,2};
    
            printf("a=%d\n",a);
            printf("*a=%d\n",*a);
            printf("a[0]=%d\n",a[0]);
    
            printf("a+1=%d\n",a+1);
            printf("*(a+1)=%d\n",*(a+1));
            printf("a[1]=%d\n",a[1]);
    	return 0;
    }

     

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    	int a[3][2]={0,1,2,3,4,5};
    
            printf("a=%d\n",a);
            printf("*a=%d\n",*a);
            printf("a[0]=%d\n",a[0]);
    	printf("&a[0][0]=%d\n",&a[0][0]);
    
            printf("a+1=%d\n",a+1);
            printf("*(a+1)=%d\n",*(a+1));
            printf("a[1]=%d\n",a[1]);
            printf("&a[1][0]=%d\n",&a[1][0]);
    
    	printf("*((a+1)+1)=%d\n",*((a+1)+1));
    
    	printf("a[1]+1=%d\n",a[1]+1); //方法1,a[1][1]的地址
    	printf("*(a[1]+1)=%d\n",*(a[1]+1));
            printf("*(a+1)+1=%d\n",*(a+1)+1);//方法2,a[1][1]的地址,*(a+1)表示a[1]
    	printf("*(*(a+1)+1)=%d\n",*(*(a+1)+1));//*(a+1)表示a[1]
    	return 0;
    }
    

    展开全文
  • 数组寻址

    2020-11-16 13:59:06
    一维数组寻址公式 若一维数组的下标下界为LB,上界为UB,每个元素占用S个存储单元,第一元素(其下标为LB)的地址为LOC(LB),下标为i的数组元素A[i]的地址为LOC(i),则计算LOC(i)的寻址公式为: LOC(i)=LOC(LB)+(i−LB...

    数组的顺序存储表示和实现-数组的寻址
    两种顺序映象的方式
    以行序为主序(低下标优先)

    以列序为主序(高下标优先)

    可用下标值随机的访问该数组的任意一个元素。

    计算数组元素存储地址的公式称为寻址公式。

    一维数组寻址公式
    若一维数组的下标下界为LB,上界为UB,每个元素占用S个存储单元,第一元素(其下标为LB)的地址为LOC(LB),下标为i的数组元素A[i]的地址为LOC(i),则计算LOC(i)的寻址公式为:

    LOC(i)=LOC(LB)+(i−LB)×S
    例1:
    若一维数组a[5], 每个元素占用4个存储单元,第一元素(其下标为0)的地址为LOC(0) = 1000,下标为3的数组元素a[3]的地址为LOC(3),计算LOC(3)的地址:

    LOC(3)=LOC(0)+(3−0)×4=1000+12=1012
    二维数组寻址公式
    若设二维数组A[m] [n],m、n分别表示数组的行数和列数 (从1开始),用Loc(i,j)表示数组元素A[i] [j]的地址,每个元素占用S个存储单元, 按行优先顺序存放则寻址公式为:

    LOC(i,j)=LOC(1,1)+[n×(i−1)+j−1]×S
    若设二维数组A[m] [n],m、n分别表示数组的行数和列数 (从0开始),用Loc(i,j)表示数组元素A[i] [j]的地址,每个元素占用S个存储单元, 按行优先顺序存放则寻址公式为:

    LOC(i,j)=LOC(0,0)+(n×i+j)×S
    若设二维数组A[m] [n],m、n分别表示数组的行数和列数 (从1开始),用Loc(i,j)表示数组元素A[i] [j]的地址,每个元素占用S个存储单元, 按列优先顺序存放则寻址公式为:

    LOC(i,j)=LOC(1,1)+[m×(j−1)+i−1]×S
    若设二维数组A[m] [n],m、n分别表示数组的行数和列数 (从0开始),用Loc(i,j)表示数组元素A[i] [j]的地址,每个元素占用S个存储单元, 按列优先顺序存放则寻址公式为:

    LOC(i,j)=LOC(0,0)+(m×j+i)×S
    寻址 = 基址 + 所求位置前面所有元素的个数的地址

    例1:
    一个二维数组A,行下标的范围是1到6,列下标的范围是0到7,即6行8列,A[1…6] [0…7], 每个数组元素用相邻的6个字节存储,存储器按字节编址。那么,这个数组的体积是 ( ) 个字节。

    答:

    Volume=m∗n∗L=(6−1+1)∗(7−0+1)∗6=48∗6=288
    例2:
    设数组a[0…59] [0…69]的基地址为2048,每个元素占2个存储单元,若以行序为主序顺序存储,则元素 a[32,58]的存储地址为 ( ) a[0…59] [0…69] = a[60] [70]

    答:

    ​ 根据行优先公式

    LOC(i,j)=LOC(0,0)+(n×i+j)×S
      得:

    LOC(32,58)=2048+(32∗70+58)∗2=6644
    例3:
    二维数组A[10] [20]采用列序为主方式存储,每个元素占1个存储单元,并且A[0] [0]的存储地址是200,

    ​ 则A[6] [12]的地址是( ) 。A[6] [12]: 第7行第13列

    答:

    ​ 根据行优先公式 (n代表总列数)

    LOC(i,j)=LOC(0,0)+(n×i+j)×S
      得:

    LOC(6,12)=200+(20∗6+12)∗1=332
    ​ 根据列优先公式 (m代表总行数)

    LOC(i,j)=LOC(0,0)+(m×j+i)×S
      得:

    LOC(6,12)=200+(10∗12+6)∗1=326
    例4:
    二维数组A[10…20] [5…10]采用行序为主方式存储,每个元素占4个存储单元,且A[10] [5]的存储地址是 1000,则A[18] [9]的地址是 ( ) 。

    ​ 分析:A[10…20] [5…10] 等价于A[0…10] [0…5]等价于A[11] [6], 11行6列,A[18] [9] 等价于A[8] [4]

    ​ 根据行优先公式 (n代表总列数)

    LOC(i,j)=LOC(0,0)+(n×i+j)×S
      得:

    LOC(18,9)=LOC(8,4)=1000+(6∗8+4)∗4=1208
    注意

    行序为主方式存储就是按顺序先把一行存储满后再换下一行,列序为主方式存储就是按顺序先把一列存储满后再换下一列。
    若不是N阶方阵 则按 行序 或者 列序 的寻址可能不会相同

    展开全文
  • 如图所示: 盗图。...utm_term=%E5%B7%B2%E7%9F%A5%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84A610%EF%BC%8C%E6%AF%8F%E4%B8%AA%E6%95%B0%E7%BB%84%E5%85%83%E7%B4%A0%E5%8D%A04%E4%B8%AA%E5%AD%98%E5%8
  • 文章目录定义随机访问低效的“插入”和“删除”插入操作删除操作警惕数组的访问越界问题容器能否完全替代数组?为什么数组要从 0 开始编号,而不是从 1 开始?内容小结 定义 数组(Array)是一种线性表数据结构。它...
  • 离散数学-二维数组元素寻址

    千次阅读 2019-10-05 21:03:10
    数组元素的地址计算公式 (1) 按行优先顺序存储的二维数组Amn地址计算公式 LOC(aij)=LOC(a11)+[(i-1)×n+j-1]×d 其中: LOC(a11)是开始结点的存放地址(即基地址) d为每个元素所占的存储单元数 由地址计算公式...
  • 数组

    2019-08-20 14:15:05
    这里写自定义目录标题什么是数组?低效的插入和删除插入操作删除操作解题开篇 开篇问题:为什么数组下标是从0开始,而不是从1开始; 什么是数组数组是一种线性表数据结构,它用一组连续的内存空间来存储一组...
  • 好久没写博客了,做人最难的事情就是坚持,不管怎么样,从今天开始重新捡...比例因子寻址,例如:mov reg,[ebp + esi * 4 - 8] 循环迭代 数组的优势就是循环批量的操作 0x01 数组与局部变量赋值的对比 源码: 8:
  • 讲解数组之前,要了解数组的特性 1.数据具有连续性 2.数据类型相同 比如:  int Ary[3] = {0,1,2};...我们可以看出,上面定义的数组,数据是...带有比例因子寻址 (lea reg32,[xxx + 4 *xxxx]) 一丶一维数组在汇编...
  • 二维数组数组元素存储地址的计算一问

    万次阅读 多人点赞 2019-01-31 08:55:59
    关于二维数组数组元素的存储地址,有同学问出了个好问题。  在我的课件中,出现了下面的讲解:  a[i][j]的地址是p+(i*col+j)*d(d是数组元素所占的字节数)。  同学编程序进行验证,出问题了:  地球停止...
  • 多维顺序存储数组之地址求解问题

    万次阅读 多人点赞 2017-11-26 15:50:28
    近期数据结构课讲到多维数组及矩阵,说到数据存储在计算机中实际存储顺序的时候就晕了,概念自己倒是知道,但是自己算的时候就迷迷糊糊。身边也有同学和我抱怨说老师上课进度太快了,认为虽然c里面提过但上课还是...
  • 事实上,访问二维数组D(定义为ElementType D[R][C])中的i行j列的元素时,通用的寻址方法是 &D[i][j]=x D +L(C·i+j) ,其中xD为二维数组的首地址,L为数组的元素数据类型的大小,C为定义的行长度。 数组指针的...
  • 一,n维数组地址计算公式 ji表示n维数组中该元素在第i维中的坐标 ai表示n维数组中第i维的起始坐标 bi表示第i维度的长度 L表示一个元素所占的字节数 LOC(…)表示该坐标对应的存储中的地址(一维坐标) PS.对与简单...
  • 提到数组,我想你肯定不陌生,甚至还会自信地说,它很简单啊。 是的,在每一种编程语言中,基本都会有数组这种数据类型。不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构。尽管数组看起来非常...
  • C11- 数组

    2019-05-20 12:01:39
    文章目录复习上一次学习的函数过程数组定义与使用数组的初始化数组名是什么sizeof运算符的作用数组的原理数组的两个特点数组的寻址公式数组作为参数传参的特点二维数组二维数组寻址公式俄罗斯方块铺垫 复习上一次...
  • Java数据结构(3)-数组

    2018-03-04 15:12:58
    在java中,数组是查询性能最高的数据类型,同时也是集合类型的底层实现。内存结构String[] array = new String[10];如上,这里new了一个数组对象,数组中有10个引用元素,每个引用 又可以指向一个String对象。这10个...
  • #一:数组的类型定义 ...#三:多维数组物理地址寻址: 注:r表示数据类型所占字节大小 m是行序,n是列序 ##二维数组Amn物理地址计算公式: 按行序求地址: Loc(aij)= Loc(a11) + ((i-1) *n +
  • 数组在函数内 数组作为参数 数组作为返回值 下标寻址和指针寻址 下标值为整型常量的寻址 下标值为整型变量的寻址 下标值为整型表达式的寻址 数组越界 多维数组 存放指针类型数据的数组 指向数组的指针变量  虽然...
  • 文章目录数据结构与算法|第三章:数组1.项目环境2.什么是数组?2.1 线性表(Linear List)2.2 连续内存空间&相同类型2.3 数组数据访问3.低效插入&删除3.1 插入3.2 删除4.集合容器和数组如何选择?5.为什么...
  • 详解数组的下标

    千次阅读 2020-08-03 10:11:07
    提到数组,我想你肯定不陌生,甚至还会自信地说,它很简单啊。是的,在每一种编程语言中,基本都会有数组这种数据类型。不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构。尽管数组看起来非常...
  • 知识点二:数组

    2019-11-27 15:53:24
    提到数组,我想你肯定不陌生,甚至还会自信地说,它很简单啊。 是的,在每一种编程语言中,基本都会有数组这种数据类型。不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构。尽管数组看起来非常...
  • 数据结构——数组

    2019-03-15 20:34:45
    数组不仅是编程语言中的一种数据类型,也是最基础的数据结构。 1. 数组的基本概念 数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。 1.1 线性表 线性表就是数据排成像一条...
  • 多维数组存储的两种方式

    万次阅读 2013-11-08 12:47:30
    1 数组存储的要求 数组存储的要求:连续存储。   连续:数组的n个元素对应n(或n+1)个内存地址,两相邻元素的地址相邻。   相邻元素:对于一维数组来说,相邻元素没有多大的选择,就是下标差绝对值为1的两...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,475
精华内容 2,590
关键字:

数组寻址公式