社区
C语言
帖子详情
数组的数组跟多维数组的区别?
megaboy
2005-07-19 04:22:20
有些书说,多维数组跟数组的数组是不同的,虽然他们的内存映象是一样的......
也有些书说,C实现的是数组的数组,不是真正的多维数组.....
但这些书都没有说清楚原因。偶想来想去想不明白两者间究竟是什么区别?
...全文
825
29
打赏
收藏
数组的数组跟多维数组的区别?
有些书说,多维数组跟数组的数组是不同的,虽然他们的内存映象是一样的...... 也有些书说,C实现的是数组的数组,不是真正的多维数组..... 但这些书都没有说清楚原因。偶想来想去想不明白两者间究竟是什么区别?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
这个是不是和“多维数组”有所区别呢?
超级管理员9527
2005-07-20
打赏
举报
回复
数组的数组,怀疑这个概念是唬人的:)
按楼上上上。。。说的,就是 指针数组+数组指针
超级管理员9527
2005-07-20
打赏
举报
回复
呵呵,那如何一句话定义一个
0 0 0
0 0
0 0 0 0
这样的数组的数组呢?
megaboy
2005-07-20
打赏
举报
回复
所谓数组的数组,就是一个数组的元素又是一个数组,余此类推。
我觉得naturemickey(周游世界)和AtaLoss0202(星空天宇)说的都有点道理,thinking hard in arrays....
超级管理员9527
2005-07-20
打赏
举报
回复
啥数组的数组?
孤陋寡闻了,只知道指针数组
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)
易语言重定义
多维
数组
易语言重定义
多维
数组
源码,重定义
多维
数组
,min,pInt,pInts,RtlCopyMemory,RtlMoveMemory
对C#中
多维
数组
,进行学习.实现
多维
数组
的输入和输出
对C#中
多维
数组
,进行学习.实现
多维
数组
的输入和输出. 源码. 实现对
多维
数组
的动态输入,和
多维
数组
的输出.
微服务系列第六季-Java
数组
的使用
第六季主要是给大家介绍一下Java
数组
的使用,包括:
数组
的概念、
数组
的基本用法、处理
数组
、
数组
做为参数使用、
多维
数组
的定义及初始化、二维
数组
求和、班级学生个人求和、班级学生个人成绩求最大值、班级学生个人...
多维
数组
下标计算
多维
数组
下标计算
多维
数组
下标计算
多维
数组
下标计算
多维
数组
下标计算
多维
数组
下标计算
多维
数组
下标计算
多维
数组
下标计算
多维
数组
下标计算
易语言赋值定义
多维
数组
易语言赋值定义
多维
数组
源码,赋值定义
多维
数组
C语言
69,373
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章