首页 > 解决方案 > 使用一维数组创建二维整数数组

问题描述

我很难理解如何创建一个函数,该函数从两个标记为 rows 和 cols 的整数值创建一个二维整数数组,这些值在一个 1-D 数组中使用,然后依次用于创建 2-D大批。

我正在尝试使用两个参数,它们是我想要模拟的数组的行数和列数。我想返回一个指向需要动态分配的数据结构的指针,该数据结构有足够的空间来保存数组

标签: carraysfunction

解决方案


要实现具有类型元素的R行和列的数组,可以通过以下方式分配内存:CT

T *MyArray = malloc(R * C * sizeof *MyArray);
if (!MyArray) ReportError…

然后可以通过以下方式访问行r和列中的元素c

MyArray[r*C + c] = NewValue; // Set element [r, c] to NewValue.

T Value = MyArray[r*C + c]; // Get value of element [r, c].

可以通过以下方式释放内存:

free(MyArray);

要为此类数组构建更精美的界面,您可以使用:

#include <stdio.h>
#include <stdlib.h>


typedef int T;

typedef struct { T *A; size_t R, C; } Array2D;


void ReportError(void)
{
    fprintf(stderr, "Error, something went wrong.\n");
    exit(EXIT_FAILURE);
}

// Create a 2D array.
Array2D CreateArray2D(size_t R, size_t C)
{
    Array2D X = { malloc(R * C * sizeof *X.A), R, C };
    if (!X.A) ReportError();
    return X;
}


// Destroy a 2D array, releasing its memory.
void DestroyArray2D(Array2D X)
{
    free(X.A);
}


// Set the value of an element in a 2D array.
void SetArray2DElement(Array2D X, size_t r, size_t c, T x)
{
    X.A[r*X.C + c] = x;
}


// Get the value of an element in a 2D array.
T GetArray2DElement(Array2D X, size_t r, size_t c)
{
    return X.A[r*X.C + c];
}

// Get a pointer to an element in a 2D array.
T *GetArray2DReference(Array2D X, size_t r, size_t c)
{
    return &X.A[r*X.C + c];
}


// Example use.
int main(void)
{
    Array2D A = CreateArray2D(3, 4);

    for (size_t r = 0; r < 3; ++r)
        for (size_t c = 0; c < 4; ++c)
            SetArray2DElement(A, r, c, 10*r + c);

    // Show how to use reference.
    for (size_t i = 0; i < 3; ++i)
        *GetArray2DReference(A, i, i) = 100*i;

    for (size_t r = 0; r < 3; ++r)
    {
        for (size_t c = 0; c < 4; ++c)
            printf(" %3d", GetArray2DElement(A, r, c));
        printf("\n");
    }
}

大多数 C 实现都支持变长数组,可用于实现二维数组。如果您不关心能够在不支持此功能的 C 实现中使用代码,您可以使用:

T (*MyArray)[C] = malloc(R * sizeof *MyArray);
if (!MyArray) ReportError…

然后您可以通过以下方式访问行r和列中的元素c

MyArray[r][c] = NewValue;

T Value = MyArray[r][c];

推荐阅读