主题:贵人请留步,请教一下二维数组中元素的位置问题?
因为无悔
[专家分:50] 发布于 2005-05-23 09:32:00
我想不通,对于一个具有M行N列元素的二维数组,它的第i行j列在内存中的位置为什么会是:i*n+j啊?拜托了!
回复列表 (共9个回复)
沙发
moz [专家分:37620] 发布于 2005-05-23 18:08:00
记得不大清楚了,
只是记得和C语言是不同的
在C语言里面数组应该是先列后行的,这样的话
在basic里面数组应该就是先行后列了,i*n+j 就很理所当然了
这样看来我觉得basic更直观易懂一点,
否则按C语言来用,我只能把两者的关系颠倒过来,很容易搞混
dim a(1 to 5, 1 to 4)
1, 2, 3, 4
5, 6, 7, 8
9,10,11,12
13,14,15,16
17,18,19,20
板凳
飞鸟12 [专家分:2830] 发布于 2005-05-24 10:22:00
VARSEG(变量) 返回变量的段址
VARPTR(变量) 返回变量的段内偏移地址
(详见:[url=http://www.programfan.com/club/showbbs.asp?id=20559]中断调用,读写内存、端口应用讲解[/url])
DIM a(3, 5) AS INTEGER
CLS
PRINT VARSEG(a)
PRINT VARPTR(a)
PRINT
PRINT VARSEG(a(0, 0))
PRINT
PRINT VARPTR(a(0, 0))
PRINT VARPTR(a(1, 0))
PRINT VARPTR(a(2, 0))
PRINT VARPTR(a(3, 0))
PRINT
PRINT VARPTR(a(0, 1))
PRINT VARPTR(a(1, 1))
PRINT VARPTR(a(2, 1))
PRINT VARPTR(a(3, 1))
显示如下:
19022
15612
-25369
0
2
4
6
8
10
12
14
从试验结果上看,qbasic中的二维数组元素的储存顺序是 先行后列
即 :
0→ 1→ 2→ 3→ 4→ 5
0 ↓ ↓ ↓ ↓ ↓ ↓
1 ↓ ↓ ↓ ↓ ↓ ↓
2 ↓ ↓ ↓ ↓ ↓ ↓
3 ↓ ↓ ↓ ↓ ↓ ↓
3 楼
moz [专家分:37620] 发布于 2005-05-24 11:22:00
楼上的例子当中,
a 是单精度变量,和数组a()是无关的,是两个不同的变量。
我们的习惯说法是行列行列,说的是先行后列,
但按楼上的运行结果来看,应该是先列后行了。
按我的习惯 i 行 j 列当然就是 a(i,j) 了,地址就是 j * n + i 了
不过隐约记得有关qb与其他语言接口的问题好像有提及,可以有办法把排列方式调整过来以便于与C、汇编等传递数组的。
4 楼
飞鸟12 [专家分:2830] 发布于 2005-05-25 12:38:00
哈!最近在学C语言,都搞混了...
5 楼
飞鸟12 [专家分:2830] 发布于 2005-12-07 08:46:00
回想一下这个程序 和c的区别
qb 中是 dim a(m,n) as integer
c 中是 int a[m][n]; 这里 m n必须是数字
a(i,j) 和c中的a[i][j]
qb中还应该是 i+j*n
c 中则应该是 i×m+j
用行 列的说法 不容易说清楚
到底用第一个纬度做为行 还是列?
不过按照数组元素在内存中的位置依次访问的速度,比每次跳一大块再读一个数据的速度是要快些的
因而访问 a(i,j) i从0->10 j不变 的速度
比 访问 a(i,j) j从0->10 i不变 的速度
要快
6 楼
jyf1987 [专家分:930] 发布于 2005-12-08 14:28:00
C和basic类的都先行后列的吧?pascal是先列后行吧.数据结构书上说了
7 楼
QB71 [专家分:1300] 发布于 2005-12-08 22:42:00
从第一维开始计数
依次2维,3维.....
如:
a(2,3)
地址排列:
a(0,0)
a(1,0)
a(0,1)
a(1,1)
a(0,2)
a(1,2)
8 楼
net56789 [专家分:210] 发布于 2005-12-09 10:13:00
QB71写的可不明白了?
书不是是这么写的吗?
A(2,3):
A(0,0),A(0,1),A(0,2),A(0,3),A(1,0),A(1,1),A(1,2),A(1,3),A(2,0),A(2,1).........
9 楼
moz [专家分:37620] 发布于 2005-12-09 11:48:00
要检查这个数据的存放形式并不难
DEFINT A-Z
OPTION BASE 1
DIM a(2, 3, 4)
CLS
FOR i = 1 TO 2
FOR j = 1 TO 3
FOR k = 1 TO 4
a(i, j, k) = i * 100 + j * 10 + k
NEXT k, j, i
DEF SEG = VARSEG(a(1, 1, 1))
s = VARPTR(a(1, 1, 1))
FOR ii = s TO s + 2 * 3 * 4 * 2 - 2 STEP 2
PRINT PEEK(ii);
NEXT
DEF SEG
可见,第一维变化最快,最后一维变化最慢
我来回复