`
michael-java
  • 浏览: 18881 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
最近访客 更多访客>>
社区版块
存档分类
最新评论

第二章 再一次吃惊----数组的数组与多维数组的区别

阅读更多

 

看见这个题目,也许有些人就会嘀咕了:难道两者不是一样的吗?C语言的多维数组不就是数组的数组吗?不!两者是有区别的,而且还不小呢。首先看看两者的共同点:

1。内存映象一样。

2。数组引用方式一样,都是“数组名[下标][下标]........”。

3。数组名都是数组的首地址,都是一个符号地址常量、一个右值。


        由于两者的共同点主要反映在外部表现形式上,因此,从外部看来,数组的数组跟多维数组似乎是一样的,这造成了C程序员对两者的区别长期以来模糊不清。但实际上,c语言限于本身的语言特性,实现的并非真正的多维数组,而是数组的数组。

         数组的数组与多维数组的主要区别,就在于数组的数组各维之间的内在关系是一种鲜明的层级关系。上一维把下一维看作下一级数组,也就是数组嵌套。数组引用时需要层层解析,直到最后一维。 举个例,对于数组:
int a[7][8][9];
如果要访问元素a[4][5][6],首先就要计算第一维元素4的地址,也就是a+4,由于是数组的数组,元素4的值代表了一个数组,因此元素4的值就是它所代表的那个数组的首地址,我们用一个符号address1代表它,也就是address1=*(a+4),接着计算第二维,显然元素5的地址是address1+5,其值也是一个数组的首地址,用address2表示它,就是address2=*(address1+5),最后一维,由于已经到达了具体的元素,因此这个元素的地址是address2+6,其值*(address2+6)是一个整数,把address1和address2分别代入相应表达式,就成了:
*(*(*(a+4)+5)+6);
这就是我们熟知的[]运算符的等价表达式。

        而真正的多维数组并没有这么多“束缚”,相比之下简单得多,由于各维之间不是这种复杂的层级关系,元素a[4][5][6]的偏移量可以这样直接获得:(4x8x9+5x9+6)xsizeof(int),再加上数组的首地址a就是元素a[4][5][6]的地址了。但是,c语言的数组能够这样用首地址加上(4x8x9+5x9+6)xsizeof(int)的形式来访问元素吗?显然是不行的。归根到底就在于C语言的地址数据类型不但有类型,还具有级别。就是这种层级关系造成了C语言只能用数组的数组当作多维数组。如果C语言非得要实现真正的多维数组,那么地址与指针的概念就得重新改写了。

----------------------------------------------------------------------------------------------------------------------------

-------------------------卑微的分割线---------------------------------------------------------------转载:没油的猪

分享到:
评论

相关推荐

    易语言赋值定义多维数组

    在易语言中,数组是存储一系列相同类型数据的数据结构,而多维数组则是数组的一种扩展,可以理解为数组的数组,允许我们在一个变量中存储多个有序的数据集合。 在"易语言赋值定义多维数组"这个主题中,我们将深入...

    多维数组下标计算 多维数组下标计算 多维数组下标计算

    二维数组可以看作是一种特殊的矩阵,每个元素aij既属于第i行的行向量,也属于第j列的列向量。二维数组可以用行优先顺序或列优先顺序进行存储。 三、多维数组 多维数组可以看作是一种高维的数组,每个元素aijk既...

    易语言重定义多维数组

    多维数组可以理解为数组的数组,它能够存储二维或更高维度的数据,比如表格、矩阵等。 本资源名为“易语言重定义多维数组源码”,意味着它提供了一种方法来重新定义已经创建的多维数组。在易语言中,动态调整数组...

    数据结构多维数组课程设计

    在计算机科学领域,特别是数据结构的学习和应用中,多维数组是一种重要的数据组织方式。它能够有效地处理多维数据,如图像处理、矩阵运算等场景。本课程设计基于严蔚敏习题集,旨在帮助学习者深入理解多维数组的概念...

    C++ 数组 多维数组 -- 二维数组

    "C++ 数组 多维数组 -- 二维数组" 在计算机编程中,数组是一种重要的数据结构,它允许我们在一个变量名下存储多个值。今天,我们将学习 C++ 中的数组,包括一维数组和多维数组。 首先,让我们来了解数组的概念和...

    多维数组程序设计 多维数组程序设计

    多维数组程序设计是计算机科学中的一种重要技术,多维数组是指数组中的每个元素都是一个数组,多维数组可以用来描述复杂的数据结构。多维数组程序设计的主要目的是使用数组进行较为复杂的应用,学习使用数组进行数据...

    数据结构中有关多维数组的课程设计

    在编程语言中,多维数组通过声明数组的维度和大小来创建,例如在C++中,我们可以声明一个二维数组`int arr[3][4]`,表示一个包含3行4列的整数矩阵。 接下来,我们要讨论多维数组的存储方式。在内存中,多维数组通常...

    VB 多维数组实例

    访问多维数组元素与一维数组类似,通过指定每个维度的索引来获取或修改元素值。如: ```vb Dim value As Integer value = myArray(1, 2) ' 获取第二行第三列的值 myArray(0, 0) = 5 ' 修改第一行第一列的值 ``` 五...

    交错数组与多维数组的区别

    最常见的多维数组是二维数组,它类似于一个表格,有行和列。在C#中,你可以声明一个二维数组如下: ```csharp int[,] multiDimensionalArray = new int[3, 4]; ``` 这将创建一个3行4列的二维数组。多维数组的访问...

    对C#中多维数组,进行学习.实现多维数组的输入和输出

    在C#编程语言中,多维数组是一种非常重要的数据结构,它允许我们存储二维或更高维度的数据。在本教程中,我们将深入探讨如何创建、初始化和操作多维数组,以及如何实现它们的输入和输出。 首先,让我们了解什么是...

    交错数组和多维数组分析

    #### 四、交错数组与多维数组的区别 1. **形状差异**:交错数组的每一行可以有不同的长度,而多维数组的每一行长度必须相同。 2. **内存布局**:交错数组实际上是多个数组的数组,每个子数组独立存储;而多维数组则...

    易语言子程序返回多维数组的实现方法

    在易语言中,数组可以是一维的,也可以是多维的,例如二维数组(表格)、三维数组等。多维数组可以看作是数组的数组,它在内存中连续存储,可以通过多个索引来访问元素。 要使子程序返回多维数组,我们需要以下几个...

    C++动态创建多维数组

    在C++编程语言中,动态创建多维数组是一种在运行时确定数组大小并分配内存的方法。这与静态数组不同,静态数组在编译时就需要指定大小。动态创建数组提供了更大的灵活性,特别是在处理不确定数据量或者需要根据用户...

    java多维数组

    #### 一、多维数组的概念与背景 多维数组是指具有两个或更多维度的数组,通常我们所说的多维数组至少包括二维数组和更高维度的数组。在现实生活中,多维数组的应用场景十分广泛,比如学校的班级管理系统中,学生...

    matlab 三维 数组 多维数组-创建多维数组-使用特殊函数 算法开发、数据可视化、数据分析以及数值计算 Matlab课程

    例如,`A(:,:,2)`将获取三维数组A的第二层。 3. **特殊函数的使用**:MATLAB提供了一些函数,如reshape、permute和squeeze,用于改变数组的维度和排列。reshape可以改变数组的形状而不改变其元素,permute用于重新...

    设计并模拟实现整型多维数组类型

    在数据结构的学习中,设计并模拟实现整型多维数组类型是一项重要的实践任务。多维数组是计算机科学中处理复杂数据的一种基础结构,它能够帮助我们有效地存储和操作矩阵或类似表格的数据。在这个课程设计中,我们将...

    如何把多维数组[,]切割成一维数组行[]

    ### 如何将多维数组切割成一维数组行 在计算机科学中,多维数组是一种存储数据的有效方式,尤其在处理具有多个维度的数据结构时(如矩阵)。有时我们需要将这样的多维数组转换为一系列的一维数组,这在很多场景下都...

    matlab语言及其应用-多维数组

    例如,对于一个三维数组 A,可以通过 A(:,:,1) 来访问第一页的二维数组,也可以通过 A(:,:,2) 来访问第二页的二维数组。 四、多维数组的算术运算 Matlab 数组支持线性代数中所有的矩阵运算。Matlab 提供了多种数组...

    matlab-多维数组

    在MATLAB中,多维数组是一种非常重要的数据结构,它能够容纳超过两维的数据,比如三维数组、四维数组等,甚至是更高维度的数组。这些数组可以用来表示图像、视频、多变量数据集等复杂信息。 多维数组的定义: 在...

Global site tag (gtag.js) - Google Analytics