📜  C中的锯齿状数组或数组数组(带示例)(1)

📅  最后修改于: 2023-12-03 14:40:25.457000             🧑  作者: Mango

C中的锯齿状数组或数组数组
简介

在C语言中,数组是一种非常常见的数据结构。通常情况下,我们定义的数组是固定大小的,但有时候需要定义可变大小的数组,这就需要用到锯齿状数组或数组数组。

数组数组就是每个数组都对应一个数组的数组,可以实现动态设置数组大小的功能。锯齿状数组也是一种动态数组,不同之处在于每个数组的大小可以不一样,形状像锯齿一样。

定义锯齿状数组和数组数组

定义锯齿状数组和数组数组的方法都非常简单,只需要使用指针数组来实现即可。下面是定义锯齿状数组的示例代码:

int main()
{
    int **p;
    int i, j;

    p = (int **)malloc(sizeof(int*) * 3); // 定义3行
    for (i = 0; i < 3; i++)
    {
        p[i] = (int *)malloc(sizeof(int) * (i + 1)); // 定义不同列
        for (j = 0; j <= i; j++)
        {
            p[i][j] = j + 1;
            printf("%d ", p[i][j]);
        }
        printf("\n");
    }

    return 0;
}

上面的代码定义了一个3行的锯齿状数组,第一行有1个元素,第二行有2个元素,第三行有3个元素。运行后输出:

1
1 2
1 2 3

下面是定义数组数组的示例代码:

int main()
{
    int *p[3];
    int i, j;

    p[0] = (int *)malloc(sizeof(int) * 1); // 第1个数组有1个元素
    p[1] = (int *)malloc(sizeof(int) * 2); // 第2个数组有2个元素
    p[2] = (int *)malloc(sizeof(int) * 3); // 第3个数组有3个元素

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

    return 0;
}

上面的代码定义了一个3个元素的数组数组,第1个数组有1个元素,第2个数组有2个元素,第3个数组有3个元素。运行后输出:

1
1 2
1 2 3
动态调整锯齿状数组和数组数组大小

既然使用数组数组或锯齿状数组的主要目的是动态调整数组大小,那我们就来看看如何实现动态调整。

下面是调整锯齿状数组大小的示例代码:

int main()
{
    int **p;
    int i, j;

    p = (int **)malloc(sizeof(int*) * 2); // 定义2行
    for (i = 0; i < 2; i++)
    {
        p[i] = (int *)malloc(sizeof(int) * (i + 1)); // 定义不同列
        for (j = 0; j <= i; j++)
        {
            p[i][j] = j + 1;
            printf("%d ", p[i][j]);
        }
        printf("\n");
    }

    // 调整大小
    p = (int **)realloc(p, sizeof(int*) * 4); // 定义4行
    for (i = 2; i < 4; i++)
    {
        p[i] = (int *)malloc(sizeof(int) * (i + 1)); // 定义不同列
        for (j = 0; j <= i; j++)
        {
            p[i][j] = j + 1;
            printf("%d ", p[i][j]);
        }
        printf("\n");
    }

    return 0;
}

上面的代码首先定义了一个2行的锯齿状数组,然后使用realloc函数将数组大小调整为4行。运行后输出:

1
1 2
1 2 3
1 2 3 4

下面是调整数组数组大小的示例代码:

int main()
{
    int *p[2];
    int i, j;

    p[0] = (int *)malloc(sizeof(int) * 1); // 第1个数组有1个元素
    p[1] = (int *)malloc(sizeof(int) * 2); // 第2个数组有2个元素

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

    // 调整大小
    p[2] = (int *)malloc(sizeof(int) * 3); // 第3个数组有3个元素

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

    return 0;
}

上面的代码首先定义了一个2个元素的数组数组,然后动态增加了第3个数组。运行后输出:

1
1 2
1 2 3
总结

锯齿状数组和数组数组都是非常常见的动态数组,它们的定义和使用非常简单。使用指针数组的特性,我们可以非常方便地调整数组大小,实现动态数组的功能。