当前位置:首页 > 内存 > 正文

二维数组在内存中的存放方式为按

  • 内存
  • 2024-06-05 23:58:18
  • 5354

一、二维数组元素在内存中的存放顺序是二维数组的元素在内存中的存储顺序是逐行的。访问数据时,如果没有x,则无法检索值。但如果没有y,则可以通过地址输出x行中的某些值。
在C语言中,二维数组的元素在内存中是逐行存储的。二维数组A[m][n],是m行n列的二维数组。
如何在一维内存中存储二维数组,有两种方式:一种是按行排序,即放置完一行后,依次放置第二行。另一种是按列排序,即放置一列后,将其放置在第二列中。在C语言中,二维数组按行排序。


二、C语言中“二维数组行指针”是什么意思首先我们从存储的角度来全面了解一下二维数组。二维数组在内存中按照先行后列的顺序存储。从内存角度来说,可以说二维数组实际上就是一维数组,内存中不存在二维的概念。如果把二维数组的每一行看成一个整体,即数组中的一个元素,那么整个二维数组就是一个一维数组,每一行都是它的元素。这应该很容易理解。
首先我们详细介绍一下二维数组和指针的关系。-
首先定义一个二维数组array[3][4],其中p是指向数组的指针。
如果p=array[0],那么p指向二维数组第一行的首地址,那么p+i就会指向array[中的元素array[0][i]0]数组。从上面介绍的二维数组在内存中的存储方式可以看出,对于数组中的任意元素array[i][j],其指针的形式为:p+i*N+j(N为每行长度的数量)。元素对应的指针表示为:*(p+i*N+j),下标表示为:p[i*N+j]。
例如:
数组[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
int*p=array[0];
数组array有四个元素,分别是array[0]、array[1]、array[2]、array[3],每个元素是一个包含3个元素的一维数组。例如array[0]的三个元素分别是array[0][0]、array[0][1]、array[0][2]。
元素数组[2][2]对应的指针为:array+2*3+2,
指针表示为:*(array+2*3+2),
下标表示为:数组[2*3+2]。
特别说明:虽然array[0]和array都是数组的首地址,但是它们指向不同的对象。这一点应该很清楚了。array[0]是一维数组的名称,它指向一维数组array[0]的首地址,所以*array[0]和array[0][0]是同一个值。Array是二维数组的名称,指向其元素的首地址,每个元素是一个行数组。它使用“行”作为指针移动单位。例如,array+i指向第i行。对array进行*运算,得到一维数组array[0]的首地址,因此*array和array[0]的值相同。如果定义了int*p,p是一个int类型的指针,指向的是int类型,而不是地址。因此,有如下操作:p=array[0](正确),p=array(错误)。对此要非常小心。
其次,看看如何使用数组名作为地址来表示元素。
对于二维数组array,array[0]是由array指向的,所以*array和array[0]是一样的。以此类推,array[i]是由array+i指向的,*(array+i)与array[i]相同。因此,对于数组元素array[i][j],数组名表示为*(*(array+i)+j),指向该元素的指针为*(array+i)+j。
注意:虽然数组名是一个地址,但它与指向数组的指针具有不同的属性。指针变量可以随时更改它们指向的对象,但数组名称不能。一旦定义,它们就不能被指定为指向另一个数组,但在Java中可以。
第三,我们来看看不太常用的“行数组指针”。
对于二维数组array[4][3]来说,和int*p是一样的。二维数组名array不能直接赋值给p。原因前面已经提到过,两个对象的性质是不同的。在C语言中,可以定义一个行数组指针,使该指针与二维数组名具有相同的属性,并可以实现它们之间的直接赋值。行数组指针定义如下:
int(*p)[3];表示数组*p有3个int类型元素,分别是(*p)[0]、(*p)[1]、(*p)[2],即p指向一个一维数组三个int类型,即p是行指针。此时,下面的操作p=array是正确的。
四、使用二维数组作为函数参数。
使用二维数组作为函数参数一般有两种方式:(1)voidfunc(int**array){...}(2)voidfunc(intarray[][N])
注意第二个这个方法必须指定二维数组的列数
当二维数组名作为函数参数时,对应的形参必须是行指针变量。
与一维数组相同,数组名作为地址值传递给变量。因此,对应的形参也必须是同一类型的指针变量,而函数中引用的将是主函数中的数组元素。,系统只为形参分配一个存储单元来存储地址,不可能在调用函数时为形参开辟一系列存储单元来存储数组。
intmain()
double[3][4];
……
fun(a);
……
fun(double(*a))[n])
……