使用动态方式创建1D和2D矩阵

发布时间 2023-11-28 09:34:45作者: 风中狂笑
int *create1DArray(int size)
{
    int i;
    int *arr = (int *)(malloc(sizeof(int) * size));
    for (i = 0; i < size; i++)
    {
        arr[i] = i * i;
    }
    return arr;
}

int *create2DArray(int rows, int cols)
{
    int i, j;
    int **arr = (int **)(malloc(sizeof(int *) * rows));
    for (i = 0; i < rows; i++)
    {
        arr[i] = (int *)(malloc(sizeof(int) * cols));
        for (j = 0; j < cols; j++)
        {
            arr[i][j] = (i * j) + (i + j);
        }
    }
    return arr;
}

 

这段代码的目的是创建一个二维数组,并返回一个指向该数组的指针。这个二维数组的大小是由参数 `rows` 和 `cols` 决定的。这是一种常见的在C语言中动态创建二维数组的方法。

下面是对这段代码的逐行解释:

1. `int **arr = (int **)(malloc(sizeof(int *) * rows));`:这行代码首先计算需要为行指针数组分配多少内存(每个行指针的大小是 `sizeof(int *)`,因此需要的总内存是 `sizeof(int *) * rows`),然后调用 `malloc` 来分配这么多的内存。分配的内存的地址被存储在 `arr` 中,`arr` 是一个指向指针的指针(也就是说,它指向的东西本身是一个指针)。

2. `for (i = 0; i < rows; i++)`:这个循环遍历每一行。

3. `arr[i] = (int *)(malloc(sizeof(int) * cols));`:这行代码在每一行中分配内存,用于存储该行的元素。每个元素的大小是 `sizeof(int)`,因此需要的总内存是 `sizeof(int) * cols`。分配的内存的地址被存储在 `arr[i]` 中,`arr[i]` 是一个指针(也就是说,它指向的东西是一个整数)。

4. `for (j = 0; j < cols; j++)`:这个循环遍历每一列。

5. `arr[i][j] = i * cols + j;`:这行代码计算一个值并将其存储在数组的特定位置(即第 `i` 行第 `j` 列)。

6. `return arr;`:这行代码返回创建的二维数组的地址。

在这个函数执行完后,你将得到一个动态分配的二维数组,其行数为 `rows`,列数为 `cols`,并且每个元素的值为 `i * cols + j`,其中 `i` 是该元素所在的行,`j` 是该元素所在的列。

void print2DArray(int **p, int rows, int cols)
{
    printf("2D Array:\n");
    for (int i = 0; i < rows; i++)
    {
        printf("[");
        for (int j = 0; j < cols; j++)
        {
            printf("%d", p[i][j]);
            if (j != cols - 1)
            {
                printf(", ");
            }
        }
        printf("]\n");
    }
}

void print1DArray(int *p, int size)
{
    printf("Array: [");
    for (int i = 0; i < size; i++)
    {
        printf("%d", p[i]);
        // 不在最后一个元素后面打印逗号
        if (i != size - 1)
        {
            printf(", ");
        }
    }
    printf("]\n");
}