在Java语言中,可将二维数组视为一维数组的数组,其中一维数组的每个元素都是一个一维数组。接下来主要以二维数组为例来介绍多维数组的使用。......
2023-11-22
二维数组在存储时也是有序地占用一片连续的内存区域,数组的名字表示这段存储区域的首地址。需要特别注意的是,二维数组起始地址有多种表示方法,而且这些表示方法在物理含义上还有表示平面起始地址和表示线性起始地址之分,所以在使用二维数组的起始地址时必须注意区分需要用哪一种起始地址。以二维数组a为例,二维数组起始地址的表示方法以及各种表示方法的级别(包含的物理含义)有:
·数组名:a,表示二维数组的起始地址,二级地址;
·数组首元素地址:&a[0][0],表示二维数组的线性起始地址,一级地址;
·数组0号行名字:a[0],表示二维数组的线性起始地址,一级地址;
·数组名指针运算后的地址:*a,表示二维数组的线性起始地址,一级地址;
由于二维数组的起始地址有一级地址和二级地址之分,所以二维数组作为函数调用实际参数时可以分为二级地址参数和一级地址参数两种。
图6.10 实际参数为二维数组名字
1.用二维数组名作为实际参数
用二维数组名作为函数参数实现的是“传地址值调用”,其本质仍然是在函数调用期间实际参数数组将它的全部存储区域提供给形式参数数组共享,即形参数组与实参数组是同一存储区域。直观地说,就是同一个数组在主调函数和被调函数中有两个不同(甚至相同)的名字。由于此时函数调用的实际参数是二维数组名,被调函数中的形式参数需要使用二维数组样式,数组存储区域全部共享时形参数组与实参数组的关系如图6.10所示。
【例6.16】 编写求二维矩阵最大元素的函数(假定矩阵为3行4列),用相应主函数进行测试。
例6.16程序的函数max中使用了二维数组样式的形式参数接收从主调函数中传递过来的二维数组首地址,使得形参数组v共享实参数组a的存储区域;然后通过对形参数组v的操作达到操作参数a的目的,即在形参数组v中寻找最大值实质上是在实参数组a中寻找最大值,程序执行的结果为:
Max value is:789。
2.用二维数组起始地址的一级地址形式作为实际参数(www.chuimin.cn)
例6.16程序的致命弱点是只能求列数是N列矩阵的最大元素。在实际应用程序设计中,有时需要能够处理任意行列大小的二维数组的函数(例如,要求上例中的函数max能够查找任意二维数组中的最大元素),此时直接用二维数组作为形式参数的设计形式就不太适合。为了提高函数的通用性,可以借助一维数组作为形式参数时可以不指定长度的特点,使用一维数组样式的形式参数接收二维数组实参。这种参数传递实质上就是要用线性数据的处理方法来处理平面形式的数据(读者可以在此基础上考虑更高维数组的处理),实现这种参数传递时须注意以下两点:
·数调用时的实际参数必须是二维数组起始地址的一级地址形式,同时还应将二维数组的构造信息(行数和列数)传递到被调函数中。
·被调函数中只知道被处理二维数组的起始地址,所以在处理过程中二维数组每一行的长度由程序员根据参数表中传递过来的信息自行控制。
【例6.17】 重新设计例6.16中的函数max,使其能够处理任意行列的二维数组,并用相应的主函数进行测试。
程序中函数max用一维数组样式的形式参数v来接收从主调函数中传递过来的二维数组首地址,注意到二维数组的名字表示的是二级地址,所以被传递的二维数组首地址要使用3种一级地址形式之一,本示例中使用的是a[0],还可以使用&a[0][0]和*a形式。在被调函数中将传递过来的二维数组当作一维数组处理,其元素对应关系应该是:a[i][j]→v[i*n+j]。程序执行的结果为:
Max value is:789。
有关C语言程序设计基础(第3版)的文章
在Java语言中,可将二维数组视为一维数组的数组,其中一维数组的每个元素都是一个一维数组。接下来主要以二维数组为例来介绍多维数组的使用。......
2023-11-22
所以,程序中可以用数据类型相同的一级指针变量来指向任意维数数组的元素。定义二维数组和合适的指针变量后,则可以使用指针变量指向数组中的任何一个元素。如果一个指针变量已经指向了一个数组元素,对指针变量进行指针运算就表示被它指向的那个数组元素。随机产生4行5列二维数组的元素值,找出其中的最小值。要求在查找过程中使用指针变量遍历二维数组。......
2023-11-20
图6.3二维数组a[3][4]示意图多维数组定义的一般形式为:数据类型符数组名[常量表达式][常量表达式]…图6.4二维数组存储示意图图6.5三维数组存储示意图根据多维数组在存储器中按行存储的规则和多维数组的行列顺序可以计算出多维数组元素存储时在线性连续存储单元中的排列序号。......
2023-11-20
在C语言中,二维数组是由一维数组作元素的一维数组。当需要用指针指向二维数组时,可以采用一级指针变量和二级指针变量两种处理形式。表8.3指向若干元素构成的一维数组指针变量表示二维数组元素使用指向由若干个元素组成的一维数组的指针处理二维数组。......
2023-11-20
首先数组元素可以作为实参,其用法与变量完全相同。图5.5程序运行结果说明:用数组名作函数参数,应该在主调函数和被调用函数分别定义数组,例中array 是形参数组名,score 是实参数组名,分别在其所在函数中定义,不能只在一方定义。图5.8程序运行结果用数组名作为函数参数时应注意以下几点:形参数组和实参数组的类型必须一致。......
2023-10-21
循环获取数组元素进行运算是很常见的操作,数组具有length属性,因此往往会使用for i++形式对数组进行迭代。in迭代数组使用typeof检测数组,返回"object",表明数组也属于对象,可以使用for…in语句会自动跳过该索引,for i++则不会跳过。◇ thisArg:可选参数,表示执行callback时绑定的this对象。动手写9.4.12执行9.4.12.html,输出结果到网页,如下图所示。图9.4.12使用forEach()迭代数组......
2023-11-08
指针及数组名作为函数的参数时,是以数据的地址作为实参调用该函数,即作为参数传递的不是数据本身,而是数据对应的地址,使实参和形参指向同一存储单元。所以,调用函数与被调函数存取的将是相同的一组空间,即双向的“地址”传递,也就是说函数调用后,实参指向的对象的值可能会发生变化。图6.15程序运行结果从程序运行结果可以明显地看出,只有swap3 函数能实现交换两个整数的目的。......
2023-10-21
而当用数组名作函数参数时,情况则不同。由于实际上形参和实参为同一数组,因此当形参数组发生变化时,实参数组也随之变化。本程序与例5.5程序相比,aver()函数的形参数组长度改为8,而在函数体中,for语句的循环条件也改为i<8。因此,形参数组a和实参数组sco的长度不一致。例5.7把例5.5程序中的函数的形参数组不指定长度,并改写程序。......
2023-11-18
相关推荐