请哪位大虾帮忙回答一下 C语言中二维数组是怎么在内存中保存的?

请哪位大虾帮忙回答一下 C语言中二维数组是怎么在内存中保存的?为什么像a[i][j]这样的数组中 a[i]直接表示地址 a[i]是另一个用来保存 行 地址的一个一维数组吗?如果是 请问存储在哪?如果不是 请问怎么实现的a[i]直接表示行地址?
其实我知道连续保存的 ,我迷惑的是怎么实现的 a[i]直接表示 行 地址。我的老师告诉我是 a[i] 是常量 但是我不能理解到底是怎么实现的直接表示地址 不知道它是怎么样保存的,保存在内蹲什么区域 。所以主要是第一个问号后面的问题的详解,谢谢大家,请大家帮下忙呀。

Pascal, C/C++, Java, Ada, and Modula-2等语言都是row-major(以行为主,即以行为高维)表示的:

比如:

int a[3][3] =
{
1, 2, 3,
4, 5, 6,
7, 8, 9
};

则其在内存中的存储形式为:

// 低地址——→高地址
......1, 2, 3, 4, 5, 6, 7, 8, 9......

FORTRAN和老版本的VB都是以column-major(以列为主,即以列为高维)的形式保存的,刚才的数组在这些语言中在内存中表示为:

// 低地址——→高地址
......1, 4, 7, 2, 5, 8, 3, 6, 9......

所以在C/C++中多维数组都是以行的形式连续地分布在内存中的,再来个例子:

int a[2][2][2];
则其在内存中的表现方式为:

a[0][0][0], 低地址
a[0][0][1],
a[0][1][0],
a[0][1][1],
a[1][0][0],
a[1][0][1],
a[1][1][0],
a[1][1][1], 高地址

具体的你可以去看看:

Write Great Code-Understanding the Machine, Volume I
7.2.2 Array Representation in Memory
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-11-27
呵呵,a[i]存的是a[i][j]的首地址,a[i]+j=&a[i][j].保存在内存什么区域自己编程输出看看就知道了。
第2个回答  2007-05-16
不管数组是几维的,在内存里都是连续排放的。
例如a[2][2] 就是"a00""a01""a10""a11"的顺序
第3个回答  2007-05-16
简单地说,C / C++语言中的多维数组,从语法上到意义上,到机器的内部表示,都是数组的数组。
如:
int array[5][8];
array是含有5个以(整数数组int subarray[8])为元素的数组。这里只要注意语句声明的优先级,是与运算符的优先级一致的。这种分析方法在C语言中是通用的。
由于数组本身是连续存储的,因此按这种分析方式,内存中数组是大地按行、小地按列(行中位)连续存储的。

其实理解C语言中的数组只要理解C语言下的计算机内存模型就可以了,也不一定非得明确具体在机器上的实现。内存模型还是比真实的机器简单许多的。
第4个回答  2007-05-20
啰唆了。二维数组的定义方法只要定了列数就行了。像三行四列的数组,可以说a[3][4],也可以说a[][4]。在内存肯定是按顺序排着12个数,a[0][0],a[0][1]......
第5个回答  2007-05-22
a[i][j]中二维数组 a[i]可直接表示的是首地址。
a[i][j]是在其后的连续排列的数。
相似回答