数组元素的地址计算问题(一维到高维)

数组元素存储地址的计算

一维数组

设一维数组A[n]存放在n个连续的存储单元中,每个数组元素占一个存储单元(不妨设为C个连续字节).如果数组元素A[0]的首地址是L,则A[1]的首地址是L+C,A[2]的首地址是L+2C,… …,依次类推,对于有:

 

二维数组

二维数组的每个元素含两个下标,如果将二维数组的第一个下标理解为行号,第二个下标理解为列号,然后按行列次序排列个元素,则二维数组呈阵列形状。例如

它是一个行号为1~m,列号为1~n的二维数组元素阵列。

如何保存二维数组?

首先要确定一个顺序

 

                     

                    0        1        2

 

                     

 

                    0        1        2

 

 

                     

 


                     

 

 

 

 

 

 

 

 

 

 


count为数组B中元素的个数,则count=9

按行优先存储

 

 

1

2

3

4

5

6

7

8

9

 

          0                 1                2  

 

 

按列优先存储

 

 

1

2

3

4

5

6

7

8

9

 

 

          0                 1                2  

 

地址如何计算?

所谓按行优先顺序,就是将数组元素按行向量的顺序存储,第个行向量存储在第个行向量之后。

下面我们计算二维数组中任一元素A[i][j]的存储地址,设每个数组元素所占空间为个连续字节。显然,A[i][j]是第个行向量B[i]中的第个元素。

 

 

1

2

3

4

5

6

7

8

9

 

          0                 1                2  

 

在A[i][j]之前的元素个数为u,分别是A[0][0]A[0][1]A[0][2],…,A[0][n]A[1][0],A[1][1],A[1][2],…,A[1][n],…,A[i-1][0]A[i-1][1]A[i-1][2],…,A[i-1][n],A[i][0],A[i][1],A[i][2],…,A[i][j-1]

每个数组元素所占空间为个连续字节

Loc(A[i][j])=Loc(A[0][0])+u*C

u=?

前i行(第0行到第i-1行)(每行n个元素)的元素个数+第i行的元素个数(A[i][0]到A[i][j-1])

因此,u=i*n+j

Loc(A[i][j])=Loc(A[0][0])+u*C

=Loc(A[0][0])+(i*n+j)*C

按列优先存储

 

 

1

2

3

4

5

6

7

8

9

 

 

          0                 1                2  

 

地址如何计算?

在A[i][j]之前的元素个数为v,分别是A[0][0]A[1][0]A[2][0],…,A[m][0]A[0][1],A[1][1],A[2][1],…,A[m][1],…,A[0][j-1]A[1][j-1]A[2][j-1],…,A[m][j-1],A[0][j],A[1][j],A[2][j],…,A[i-1][j]

每个数组元素所占空间为个连续字节

Loc(A[i][j])=Loc(A[0][0])+v*C

v=?

前j列(第0列到第j-1列)(每列m个元素)的元素个数+第j列的元素个数(A[0][j]到A[i-1][j])

因此,v=j*m+i

Loc(A[i][j])=Loc(A[0][0])+v*C

=Loc(A[0][0])+(j*m+i)*C

高维数组

按行优先:“左”下标优先,即第一(最左)下标的下标值较小的元素较先存储,第一个下标值相同者,按第二下标优先存储,对任意的k>1,对第1~(k-1)维相同者,先存储第k维中下标值较小者。

按列优先:“右”下标优先(最后一维下标为最右),先存储第n维下标值较小者,第n维下标值相同者,先存储第n-1维下标值较小者。

三维数组D[3][3][4]的顺序存储次序是

元素表示为D[i][j][k]    其中,0≤i≤2,0≤j≤2,0≤k≤3,

 

可以把它看作一维数组

B1[3]= { D[0][3][4],D[1][3][4],D[2][3][4]}

 

 

 


D[0][3][4]

i=0

 

D[0][0][0],D[0][0][1],D[0][0][2],D[0][0][3]

D[0][1][0],D[0][1][1],D[0][1][2],D[0][1][3]

D[0][2][0],D[0][2][1],D[0][2][2],D[0][2][3]

 

D[1][3][4]

i=1

 

D[1][0][0],D[1][0][1],D[1][0][2],D[1][0][3]

D[1][1][0],D[1][1][1],D[1][1][2],D[1][1][3]

D[1][2][0],D[1][2][1],D[1][2][2],D[1][2][3]

 

D[2][3][4]

i=2

 

D[2][0][0],D[2][0][1],D[2][0][2],D[2][0][3]

D[2][1][0],D[2][1][1],D[2][1][2],D[2][1][3]

D[2][2][0],D[2][2][1],D[2][2][2],D[2][2][3]

 

 

For  x=0  to 2 do

   For  y=0  to 2  do

      For  z=0 to  3  do

D[i][j][k]的地址:

Loc(D[i][j][k])=Loc(D[0][0][0])+w*C

第一个下标的变化:0i-1,共i*3*4个元素

第一个下标为i时,第二个下标的变化:0j-1,共j*4个元素

第一个下标为i,第二个下标为j时,第三个下标的变化:0k-1,共k个元素

w= i*3*4+j*4+k

Loc(D[i][j][k])=Loc(D[0][0][0])+w*C

=Loc(D[0][0][0])+(i*3*4+j*4+k)*C

 

For  z=0 to  3  do

   For  y=0  to 2  do

      For  x=0 to  2  do

 

 

 

 

j=0

j=1

j=2

 

D[3][3][0]

k=0

 

D[0][0][0],D[1][0][0],D[2][0][0]

D[0][1][0],D[1][1][0],D[2][1][0]

D[0][2][0],D[1][2][0],D[2][2][0]

j=0

j=1

j=2

 

 


D[3][3][1]

k=1

 

D[0][0][1],D[1][0][1],D[2][0][1]

D[0][1][1],D[1][1][1],D[2][1][1]

D[0][2][1],D[1][2][1],D[2][2][1]

j=0

j=1

j=2

 

 


D[3][3][2]

k=2

 

D[0][0][2],D[1][0][2],D[2][0][2]

D[0][1][2],D[1][1][2],D[2][1][2]

D[0][2][2],D[1][2][2],D[2][2][2]

j=0

j=1

j=2

 

 


D[3][3][3]

k=3

 

D[0][0][3],D[1][0][3],D[2][0][3]

D[0][1][3],D[1][1][3],D[2][1][3]

D[0][2][3],D[1][2][3],D[2][2][3]

 

For  z=0 to  3  do

   For  y=0  to 2  do

      For  x=0 to  2  do

D[i][j][k]的地址:

Loc(D[i][j][k])=Loc(D[0][0][0])+w*C

第三个下标的变化:0k-1,共k*3*3个元素

第三个下标为k时,第二个下标的变化:0j-1,共j*3个元素

第三个下标为k,第二个下标为j时,第一个下标的变化:0i-1,共i个元素

w= k*3*3+j*3+i

 

Loc(D[i][j][k])=Loc(D[0][0][0])+w*C

=Loc(D[0][0][0])+(k*3*3+j*3+i)*C

 

 

n维数组

For  =0  to    do

   For  =0  to    do

                  

      For  =0  to    do

s = ?

的变化:0~-1,共****=*个元素

等于时,的变化:0~-1,共***=*个元素

等于时,等于时,的变化:0~-1,共***=*个元素

       

等于时,等于时,…,等于时,的变化:0~-1,共个元素

s=*+*+*++*+

              

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

侯宁:不该捞的别去捞 踏空不是浪费时间

最近,偶然间在网上看到了一则寓言故事:《骆驼与北斗星》。文章不长,但内容丰富,讲得很有趣,很有哲理,也很有启发。尤其是在股市博弈中,许多人、许多机构都会在现实中扮演故事里的不同角色。因为…

大跃进和循序渐进

大跃进和循序渐进本身没有对错,只有跟具体情境结合起来才会产生对错属性。 好的大跃进就是不学走先学跑,deadline是第一生产力,一旦学会了更高级的,低级的自然而然就学会了。 好比武装革命,是先攻打大城市还是攻打农村…

Hibernate 学习(一)

一、Hibernate 简介 1、Hibernate 简介 Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句&#xff0…

(严蔚敏版)数组的顺序存储表示和实现代码

#include<stdarg.h>#include<malloc.h> /* malloc()等 */#include<stdio.h> /* EOF(^Z或F6),NULL */#include<stdlib.h> /* atoi() */#include<io.h> /* eof() */#include<math.h> /* floor(),ceil(),abs() */#include<process.h> /…

特殊权限

2.18特殊的权限set_uid [rootcentos-01 ~]# which passwd //查询一下passwd位置// /usr/bin/passwd[rootcentos-01 ~]# ls -l /usr/bin/passwd //查询一下passwd权限//-rwsr-xr-x. 1 root root 27832 6月 …

我的职场战争--一年来的开发组内战实录

一 战争准备阶段 一年前&#xff0c;国内分社派我带着几名程序员来到日本&#xff0c;进入一个世界级大公司做项目&#xff0c;这里先期驻在了一个日本总社的社员X。没有人想到战争已经临近。 二 战争酝酿阶段 日本人不会叫你闲着&#xff0c;头一个月就开始了下马威。…

linux8重启服务代码,linux(centos8):安装分布式事务服务seata(seata 1.3.0/centos 8.2)

一&#xff0c;什么是seata?Seata:Simpe Extensible Autonomous Transcaction Architecture&#xff0c;是阿里中间件,开源的分布式事务解决方案。前身是阿里的Fescar官方站:http://seata.io/zh-cn/官方代码地址:https://github.com/seata/seata官方文档站:http://seata.io/zh…

数组与矩阵的区别

数组中的元素可以是字符等 矩阵中的只能是数 这是二者最直观的区别。 因为矩阵是一个数学概念&#xff08;线性代数里的&#xff09;&#xff0c;数组是个计算机上的概念。 《精通MATLAB6.5版》&#xff08;张志涌编著&#xff0c;北京航空航天大学出版社&#xff09;中说&…

android自定义view(自定义数字键盘)

序言&#xff1a;在上周的项目中&#xff0c;需要做一个密码锁的功能&#xff0c;然后密码下面还得有键盘&#xff0c;就类似支付宝支付的时候那样&#xff1a; 当然了&#xff0c;我们项目的需求简单点&#xff0c;纯数字的就可以了&#xff0c;然后上周就百度了自定义键盘&am…

linux环境部署ltmj,Linux系统安装与简单配置 图文.docx

合肥师范学院实验报告姓名:课程名称&#xff1a;Linux院(系&#xff1a;计算机学院 专业/年级:实於Lin^系缭公装与苗瑕肚卅1.占克If Jf VVVork51at>un ?- If -JpMHIWortsktKia^2.?JGJiIjxiS4CLM.lt 1H. iuFI?H?*vW ?tVirtujl Machine Wisa rdGimm Oprraimv加蓟aBMkonA …

矩阵的压缩存储

5.3 矩阵的压缩存储 矩阵是很多科学与工程计算问题中研究的数学对象&#xff0c;在此&#xff0c;我们讨论如何存储矩阵的元&#xff0c;从而使矩阵的各种运算能有效第进行。对于一个矩阵结构显然用一个二维数组来表示是非常恰当的&#xff0c;但在有些情况下&#xff0c;比如常…

网络工程师还要学linux吗,网络工程师要学什么

想成为一个优秀的网络工程师&#xff0c;要学什么&#xff0c;怎么学呢?今天小编带你了解一下网络工程师到底要学什么。上篇我们讲到了“网络工程师发展方向”&#xff0c;列举了许多技术方向&#xff0c;那么我们该如何根据自己的定位选择学习哪些技术。重点是哪些&#xff0…

利用FormData对象实现AJAX文件上传功能及后端实现

包括HTML基础设置、CSS界面优化、JS利用FormData对象和AJAX进行上传、后端接收文件并存储到指定路径以及删除文件操作。FE HTML 基础的设置&#xff1a; <form enctype"multipart/form-data"><input id"file" type"file" multiple"…

第 6 章 —— 装饰模式

6.6 装扮模式总结 装饰模式把每个要装饰的功能放在单独的类中&#xff0c;并让这个类包装它所要装饰的对象&#xff0c;因此&#xff0c;当需要执行特殊行为时&#xff0c;客户端代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象了。 装扮模式是为已有功能动…

广义表及其存储方式简介

广义表&#xff08;Lists&#xff0c;又称列表&#xff09;是线性表的推广。线性表定义为n>0个元素a1,a2,a3,…,an的有限序列。线性表的元素仅限于原子项&#xff0c;原子是作为结构上不可分割的成分&#xff0c;它可以是一个数或一个结构&#xff0c;若放松对表元素的这种限…

Vue.js:路由

ylbtech-Vue.js&#xff1a;路由1.返回顶部 1、Vue.js 路由 本章节我们将为大家介绍 Vue.js 路由。 Vue.js 路由允许我们通过不同的 URL 访问不同的内容。 通过 Vue.js 可以实现多视图的单页Web应用&#xff08;single page web application&#xff0c;SPA&#xff09;。 Vue.…

图片转excel:“保留数字格式”在什么场景下该勾

保留数字格式是什么意思呢&#xff1f;顾名思义&#xff0c;就是将转出来的数字保留为数字格式&#xff0c;而不是文本格式。我们知道&#xff0c;OCR程序将图片上的文字识别为电脑可编辑的文字后&#xff0c;如果导入到excel不加处理&#xff0c;则单个数字过长的文字就会被ex…

html概述和基本结构

html概述 HTML是 HyperText Mark-up Language 的首字母简写&#xff0c;意思是超文本标记语言&#xff0c;超文本指的是超链接&#xff0c;标记指的是标签&#xff0c;是一种用来制作网页的语言&#xff0c;这种语言由一个个的标签组成&#xff0c;用这种语言制作的文件保存的是…

linux添加三权,基于SELinux的三权分离技术的研究

目前&#xff0c;Linux操作系统已广泛应用于各种设备和产品中&#xff0c;如服务器、PC机、机顶盒及路由器等。随着Linux系统的不断发展和广泛应用&#xff0c;Linux系统的安全问题也引起越来越多的关注。在Linux操作系统中&#xff0c;存在一个超级用户即root用户。root也称为…

二叉树、树和有序树的区别

树&#xff1a;子树没有左右之分 二叉树、有序树:左右有序 二叉树与有序树&#xff1a;在只有一棵树的情况下&#xff0c;二叉树有左右之分、有序树无左右之分 另外&#xff1a;二叉树是有序的&#xff0c;可以为空或一个根节点以及两个分别称为左子树和右子树的互不相交的二叉…