c - 使用一维数组创建二维整数数组
问题描述
我很难理解如何创建一个函数,该函数从两个标记为 rows 和 cols 的整数值创建一个二维整数数组,这些值在一个 1-D 数组中使用,然后依次用于创建 2-D大批。
我正在尝试使用两个参数,它们是我想要模拟的数组的行数和列数。我想返回一个指向需要动态分配的数据结构的指针,该数据结构有足够的空间来保存数组
解决方案
要实现具有类型元素的R
行和列的数组,可以通过以下方式分配内存:C
T
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];
推荐阅读
- c# - Microsoft TestServer 在 TFS 2018 构建任务上的 NUnit/.Net Core 中的请求失败
- python - 将特定值的元素与列表中的相邻元素合并
- python - 在熊猫中使用向量列的总和创建新列
- python - Django 序列化器查询集和检索外键值
- kubernetes - k8s - 带有服务的 postgres 的 IP 和 DNS
- c - 这两个陈述是等价的吗?
- sql-server - 我们如何将问题数据从 SQL Server 导入 QnA Maker?
- r - ggplot barplot 图不同组的大小相同
- amazon-web-services - 从 DynamoDB 中提取数据的 AWS Data Pipeline 具有与清单文件中指示的不同数量的文件
- wpf - DataGrid 的 C# wpf TwoWay 动态绑定(DataGridCheckColumn 和 DataGridTextColumn)