|
也有些书说,C实现的是数组的数组,不是真正的多维数组..... 但这些书都没有说清楚原因。偶想来想去想不明白两者间究竟是什么区别? |
|
|
|
不清楚,应该都是一样的吧,不管几维在内存中都是分配连续的空间,只是偏移量不同而已
|
|
那就先找出数组的数组和多维数组这两个名词的定义,然后判断阿
个人感觉无差异……都一样用…… |
|
存储方式一样,表示一样
使用起来一样,实在不知道有什么地方不一样 |
|
既然C专家编程和C陷阱与缺陷两本书都说有区别,那就应该是有区别的。
|
|
以前上课时候老师讲的是一样的,内存中只存在一维数组,它只是在语言这一层次上用多维的方式呈现给语言的使用者。
|
|
数组是个什么东西?
|
|
关注中
|
|
首先问一句:
数组的数组怎么定义? int a[6][6]; ??? |
|
呵呵...
路过! |
|
数组的数组!!
多维数组~ 一样都是线性表的基础上,,,,, |
|
自己顶一个
|
|
数组的数组每行不一定有同样多个无素,
多维数组则是是严格的。 |
|
C 中没有真正的数组,只有内存块和对内存块的引用。
|
|
嗯,似乎有点道理,开始有点思路了........
|
|
静态定义的多维数组在内存中都是按一维的方式分配存储的,访问的时候是经过转换的,过程类似下面.
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)); 即,首先,定义一个指针数组,该数组的每一个元素指向一个动态分配的数组(各元素指向的数组的大小可能也可以不同).这样就是数组的数组.可以看出,数组的数组的内存分配不一定是连续的,只是分配给每一个指针元素的数组的空间是连续的而已. |
|
晕,上面写错了,应该是array[i] = malloc(N * sizeof(int));
好久没有用C编程了. |
|
其实所有的语言在编译之后都没有数组的说法。
数组只是一种用来方便编程的东西,根本就没有真正的和伪的这种分别。 如果说有分别的也是编译器对数组的分析和编译能力的区别。 |
|
就是(星空天宇)解释的那样
举一个形象的例子 char a[6][6]; 如果这样定义字符串数组,必须保证第一维足够大,这样很多空间浪费了 char *a[6]; a[i] = malloc(strlen(str)+1)); 这样就可以保存任意大小字符窜,而不浪费空间 |
|
啥数组的数组?
孤陋寡闻了,只知道指针数组 |
|
所谓数组的数组,就是一个数组的元素又是一个数组,余此类推。
我觉得naturemickey(周游世界)和AtaLoss0202(星空天宇)说的都有点道理,thinking hard in arrays.... |
|
呵呵,那如何一句话定义一个
0 0 0 0 0 0 0 0 0 这样的数组的数组呢? |
|
数组的数组,怀疑这个概念是唬人的:)
按楼上上上。。。说的,就是 指针数组+数组指针 |
|
下面我节选一些《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语言支持其它语言 一般称作“数组的数组”的东西,但却称它为多维数组,这样就模糊了两者的边界,使许多人对两者 混淆不清。 |
|
我个人觉得本质是一样的 在计算机内部存储页是一样的 但是应用时可以区分~~
|
|
数组在内存中不存在多维,多维只是人们的思考习惯
|
|
在JAVA中,数组的数组可以这样定义:
a = new int[3][];//定义一个数组的数组 a[0] = new int[2]; a[1] = new int[3]; a[2] = new int[4];//定义每一个数组元素,长度为2、3、4 这个是不是和“多维数组”有所区别呢? |
|
数组的数组就是多维数组被压扁了以后的结果。
|
|
压扁了以后的结果?什么意思啊?具体说说。
|
|
知道怎么用就行了,多维数组是根据数组来定义的吧?何必搞的那么神呢?
|