【005:二维数组问题】

005:二维数组问题

在 C/C++ 中,我们将使用两个下标的数组称之为二维数组。相比于一维数组中,下标作为索引的存在,二维数组的下标索引往往带有 的意义。如表示一个四边形的四个二维坐标(x,y)这样的场景,就可以使用二维数组进行存储(使用结构体表示一个点的 x/y 坐标也是可以的)。

1. 二维数组的初始化

方式一:指定数据初始化

int a[3][2] = {0, 1, 2, 3, 4, 5}; // -Wmissing-braces
int a[3][2] = {{0, 1}, {2, 3}, {4, 5}};

方式二:默认初始化

int a[3][2] = {0}; // 全为0
int b[3][2] = {};  // 全为0
int c[3][2];       // 全为随机数

2. 二维数组的访问

方式1:下标式

#include <stdio.h>

int main(int argc, char const *argv[])
{
    (void)(argc);
    (void)(argv);

    int a[3][2] = {{0, 1}, {2, 3}, {4, 5}};

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            printf("a[%d][%d]=%d\n", i, j, a[i][j]);
        }
    }

    return 0;
}

方式二: 指针式

#include <stdio.h>

#include <stdio.h>

int main(int argc, char const *argv[])
{
    (void)(argc);
    (void)(argv);

    int a[3][2] = {{0, 1}, {2, 3}, {4, 5}};

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            printf("a[%d][%d]=%d\n", i, j, *(*(a + i) + j));
        }
    }
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            printf("a[%d][%d]=%d\n", i, j,*(&a[0][0] + i * 2 + j));
        }
    }
    return 0;
}

3. 指针式访问说明

对于指针式访问有两种写法,对应于数组地址+1数组名+1 这两种关系。

对于数组名访问的方式:

  • a+i 类型为 int (*)[2]
  • *(a+i) 类型为 int *
  • (*(a+i)+j) 类型为 int *

而使用数组地址访问,直接按照线性关系移动即可。

posted @ 2021-10-22 23:00  叶小鹏  阅读(207)  评论(0编辑  收藏  举报