多维数组的堆栈表示

时间:2014-09-09 19:35:37

标签: c

有些人可以解释一下这行吗?堆栈中二维数组的列式表示?我的老师告诉我们,如果我们有以下矩阵:

a00           a01           a02
a10           a11           a12
a20           a21           a22

Column wise representation:                     Row Wise representation:
a00                                             a00
a10                                             a01
a20                                             a02
a01                                             a10
a11                                             a11
a21                                             a12
a02                                             a20
a12                                             a21
a22                                             a22

虽然我只知道内存中多维数组的表示: a00然后a01然后是a02然后是a10,依此类推(地址顺序递增)

我在课堂上提出了这个问题b / w堆栈表示的区别是什么?多维数组的内存表示。她说我们这里做的二维数组不是指针。那是什么答案。请解释一下。

她还告诉一些公式计算堆栈中行表示和列表示的二维数组的任何元素的地址。我不明白。

位置(A [j,k])= Base_address(A)+ W(M(k-1)+(j-1))

2 个答案:

答案 0 :(得分:1)

以下是RAM中2D阵列的更好表示:

列式表示:

Chip1 Chip2 Chip3
a00   a01   a02
a10   a11   a12
a20   a21   a22

Row Wise表示:

Chip1 Chip2 Chip3
a00   a10   a20
a01   a11   a21
a02   a12   a22

答案 1 :(得分:1)

你说,

  

虽然我只知道内存中多维数组的表示:a00然后是a01然后是a02然后是a10,依此类推(地址顺序递增)

在C / C ++中,使用行表示存储多维数组。

IIRC,在FORTRAN中,使用列表示存储多维数组。

在C中,您可以将2D数组定义为:

int a[10][3];

当您将数组传递给函数时,它会衰减为int (*)[3]类型的指针。

免责声明: 我的FORTRAN生锈了,所以请原谅使用不正确的语法

在FORTRAN中,您可以将2D数组定义为:

INTEGER A(10, 3)

当您将数组传递给函数时,函数中的参数类型看起来像

INTEGER A(10, *)

语法的差异使得C中的多维数组由行表示更自然,而在FORTRAN中,它们似乎很自然地由列表示。

你也说过:

Location(A[j,k]) = Base_address(A) + W(M(k-1)+(j-1))

您似乎使用的是基于1的索引。不确定WM代表什么。

我们假设您有ROW行数和COL列数。

如果您有行代表:

Location(A[j,k]) = Base_address(A) + (j-1)*COL + (k-1)

如果您有列表示:

Location(A[j,k]) = Base_address(A) + (k-1)*ROW + (j-1)