数组的数组跟多维数组的区别?

megaboy 2005-07-19 04:22:20
有些书说,多维数组跟数组的数组是不同的,虽然他们的内存映象是一样的......

也有些书说,C实现的是数组的数组,不是真正的多维数组.....

但这些书都没有说清楚原因。偶想来想去想不明白两者间究竟是什么区别?
...全文
825 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
Feather2005 2005-07-21
  • 打赏
  • 举报
回复
数组在内存中不存在多维,多维只是人们的思考习惯
guycs 2005-07-21
  • 打赏
  • 举报
回复
我个人觉得本质是一样的 在计算机内部存储页是一样的 但是应用时可以区分~~
megaboy 2005-07-21
  • 打赏
  • 举报
回复
下面我节选一些《c专家编程》里面的话:

....................................

有些人声称C语言没有多维数组,这是不对的。ANSI C标准在第6.5.4.2节以及第69号脚注上表示:
当几个“[]”修饰符连续出现时(方括号里面是数组的范围),就是定义一个多维数组。

那些人的意思是C语言没有象其它语言一样的多维数组,如Pascal或Ada。

...........................

Ada语言在这方面的限制更紧一些,它严格地维持了数组的数组和多维数组之间的区别。在内存中

它们看上去是一样的,但在哪个类型具有兼容性以及可以被赋值给一个数组的数组的单独的行的问题

上,两者存在明显的差别。这有点象在int和float之间选择变量的类型:所选择的类型最大限度地反

映了底层的数据。在Ada中,当具有独立可变的下标时,如用笛卡尔坐标确定某一点的位置,一般会选

择多维数组。当数据在层次上更加鲜明时,如某个数组具有[12]月[5]周[7]日这样的形式来代表某事

物的每日记录,但有时也需要同时操纵整个星期或月时,一般选择数组的数组。

..................................

C语言里面只有一种别的语言称为数组的数组的形式,但C语言称它为多维数组。

C语言的方法多少有点独特:定义和引用多维数组唯一的方法就是使用数组的数组。尽管C语言把

数组的数组当作是多维数组,但不能把几个下标范围如[i][j][k]合并成Pascal式的下标表达式风格如

[i,j,k]。如果你清楚地明白自己在做什么,也介意产生不合规范的程序,可以把[i][j][k]这样的下

标值计算为相应的偏移量,然后只用一个单一的下标[z]来引用数组。当然这不是一种值得推荐的做

法。同样糟糕的是,象[i,j,k]这样的下标形式(由逗号分隔)是C语言合法的表达形式,只是它并非

同时引用这几个下标(它实际上所引用的下标值是k,也是就逗号表达式的值)。C语言支持其它语言

一般称作“数组的数组”的东西,但却称它为多维数组,这样就模糊了两者的边界,使许多人对两者

混淆不清。
Andy84920 2005-07-21
  • 打赏
  • 举报
回复
知道怎么用就行了,多维数组是根据数组来定义的吧?何必搞的那么神呢?
megaboy 2005-07-21
  • 打赏
  • 举报
回复
压扁了以后的结果?什么意思啊?具体说说。
sandrowjw 2005-07-21
  • 打赏
  • 举报
回复
数组的数组就是多维数组被压扁了以后的结果。
httpftp 2005-07-21
  • 打赏
  • 举报
回复
在JAVA中,数组的数组可以这样定义:

a = new int[3][];//定义一个数组的数组
a[0] = new int[2];
a[1] = new int[3];
a[2] = new int[4];//定义每一个数组元素,长度为2、3、4

这个是不是和“多维数组”有所区别呢?
  • 打赏
  • 举报
回复
数组的数组,怀疑这个概念是唬人的:)
按楼上上上。。。说的,就是 指针数组+数组指针
  • 打赏
  • 举报
回复
呵呵,那如何一句话定义一个
0 0 0
0 0
0 0 0 0
这样的数组的数组呢?
megaboy 2005-07-20
  • 打赏
  • 举报
回复
所谓数组的数组,就是一个数组的元素又是一个数组,余此类推。

我觉得naturemickey(周游世界)和AtaLoss0202(星空天宇)说的都有点道理,thinking hard in arrays....
  • 打赏
  • 举报
回复
啥数组的数组?
孤陋寡闻了,只知道指针数组
66766 2005-07-20
  • 打赏
  • 举报
回复
就是(星空天宇)解释的那样
举一个形象的例子
char a[6][6];
如果这样定义字符串数组,必须保证第一维足够大,这样很多空间浪费了
char *a[6];
a[i] = malloc(strlen(str)+1));
这样就可以保存任意大小字符窜,而不浪费空间
varphone 2005-07-20
  • 打赏
  • 举报
回复
其实所有的语言在编译之后都没有数组的说法。

数组只是一种用来方便编程的东西,根本就没有真正的和伪的这种分别。

如果说有分别的也是编译器对数组的分析和编译能力的区别。
AtaLoss0202 2005-07-19
  • 打赏
  • 举报
回复
晕,上面写错了,应该是array[i] = malloc(N * sizeof(int));
好久没有用C编程了.
AtaLoss0202 2005-07-19
  • 打赏
  • 举报
回复
静态定义的多维数组在内存中都是按一维的方式分配存储的,访问的时候是经过转换的,过程类似下面.
int array[100];

int index2(int m, int n) //实现array数组的二维下标访问,10行10列.
{
if(m <= 9 && n <= 9)
return array[m * 10 + n];
}

至于数组的数组,我的理解是下面这样:
int* array[100];
for(int i = 0; i < 100; i++)
array[i] = (int) malloc(N * sizeof(int));
即,首先,定义一个指针数组,该数组的每一个元素指向一个动态分配的数组(各元素指向的数组的大小可能也可以不同).这样就是数组的数组.可以看出,数组的数组的内存分配不一定是连续的,只是分配给每一个指针元素的数组的空间是连续的而已.
megaboy 2005-07-19
  • 打赏
  • 举报
回复
嗯,似乎有点道理,开始有点思路了........
Wolf0403 2005-07-19
  • 打赏
  • 举报
回复
C 中没有真正的数组,只有内存块和对内存块的引用。
naturemickey 2005-07-19
  • 打赏
  • 举报
回复
数组的数组每行不一定有同样多个无素,
多维数组则是是严格的。
megaboy 2005-07-19
  • 打赏
  • 举报
回复
自己顶一个
zjyu88 2005-07-19
  • 打赏
  • 举报
回复
数组的数组!!
多维数组~
一样都是线性表的基础上,,,,,
加载更多回复(9)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧