#M8214. 多维数组

    ID: 2349 传统题 1000ms 256MiB 尝试: 0 已通过: 0 难度: (无) 上传者: 标签>GESP四级GESP知识点详细讲解C2多维数组

多维数组

当前没有测试数据。

多维数组的定义一般形式


数据类型 数组名[行长度][列长度];

声明与初始化

int arr[3][4] = {1,2,3,4};

int arr[3][4] = {{1,2},{4,5}}; // 其余未初始化的元素为0

int arr[][4] = {{2,3},{4,5}};

二维数组如果有初始化,行可以省略,列不能省略!!

我们可以把二维数组看成由多个一维数组组成的,只有在确定每个一维数组存放多少个元素才能确定二维数组。假设省略列,那么操作系统无法得知每个一维数组分配多少个元素,从而造成二维数组的混乱。


计算存储空间


占用空间 = 元素个数 * 一个元素所需内存大小。

类型名 存储空间
char 1 个字节
bool 1 个字节
short 2 个字节
float 4 个字节
int 4 个字节
long long 8 个字节
double 8 个字节

多维数组的使用


二维数组看似多行多列,实际上是连续存储的, 本质上还是多个一维数组,如果把二维数组的每一行看作一个一维数组,那么每一行的一维数组也有数组名,arr[0]就是第一行的数组名,arr[1]就是第二行的数组名,以此类推。所以二维数组也可以通过下标的方式来引用每个元素。

格式:数组名[行下标][列下标];

int arr[3][4] = {{1,2},{4,5}, {7, 8}};

for (int i = 0; i < 3; i++)
{
    for (int j = 0; j < 4; j++)
    {
        cout << arr[i][j] << ' ';
    }
}

下标


由于数组存储空间是连续的,那么下标也可以指距起始位置的偏移量。 数组元素的存储地址 = 数组空间首地址 + 偏移量 * 一个元素内存空间。

![](file://acKvNGni3xZqdirBLrVZ4.jpeg)

以行为主序的二维数组 a[m][n]a[m][n](下标从 0 开始),求 a[i][j](0i<m0j<n)a[i][j] (0 ≤ i < m,0 ≤ j < n) 对于前 i1i−1 行,共有 ii 行,每行 nn 个元素,一共有 ini∗n 个元素;对于第 ii 行,之前有 jj 个元素;故 a[i][j]a[i][j] 的存储位置相对于数组空间首地址偏移量为 in+ji∗n+j

![](file://Xaj4tMg9yWaifK0qNY_7n.jpeg)

以行为主序的二维数组 a[m][n]a[m][n](下标从 1 开始),求 a[i][j](0i<m0j<n)a[i][j](0 ≤ i < m,0 ≤ j < n) 对于前 i1i−1 行,共有 i1i−1 行,每行 nn 个元素,一共有 (i1)n(i−1)∗n 个元素;对于第 ii 行,之前有 j1j−1 个元素; 故 a[i][j]a[i][j]的存储位置相对于数组空间首地址偏移量为 (i1)n+j1(i−1)∗n+j−1