0

如果你想实现一个二维数组;您更喜欢以下哪种技术

1.Row Major/Col Major 2.指针数组

4

3 回答 3

2

在本书Numerical Recipes in C在线版)中,您可以在第 20-23 页找到一章,讨论它们如何实现二维数组。

于 2012-08-25T14:49:25.853 回答
1

如果二维数组的使用在多个函数中,或者大小太大,那么我们可以使用指针变量动态分配二维数组,如下所示。

int *a;

a = (int *)malloc(ROWSIZE * COLSIZE * sizeof(int));

//This 2D dynamic array should be accessed like below

for (i = 0; i < ROWSIZE; i++)
{
    for (j = 0; j < COLSIZE; j++)
    {
        a[(i * ROWSIZE) + j] = i + j;
    }
}

或者我们也可以使用双指针变量,如下所示

int **a;
a = (int **)malloc(ROWSIZE * sizeof(int*));
for(i = 0; i < ROWSIZE; i++)
{
    a[i] = (int *)malloc(COLSIZE * sizeof(int));
}

//This 2D dynamic array should be accessed like below

for (i = 0; i < ROWSIZE; i++)
{
    for (j = 0; j < COLSIZE; j++)
    {
        a[i][j] = i + j; //readability is more in this method
    }
}

如果二维数组的使用只是一个函数内部,而且大小不是太大,我们可以使用本地二维数组。因为动态内存分配是一个代价高昂的过程。

int a[ROWSIZE][COLSIZE];

注意:注意空检查malloc

于 2012-08-25T13:43:16.430 回答
0

当然,指针数组方法提供了很好的语法优势,即能够以良好的旧 C 语法(即 a[3][4])寻址数组的元素。并且,如果适合您的项目,它允许每行具有不同的长度。但是,我认为内存管理不值得付出努力,并且可能会影响性能,因为每次访问都需要两个取消引用步骤。假设您正在分配行,您可以将它们视为 C 数组,它们就是这样,并优化性能,但必须始终以方便但缓慢的方式对列进行索引。

至于单一分配方法中的行或列主顺序,这完全取决于您要做什么。如果您更有可能需要连续的行,请使用主要行。如果您正在做线性代数,则更常见的是要使用列,因此列专业更方便。

我已经用数值软件做了大量的工作,发现单一分配方法最适合我。我通常使用列专业,因为与 Fortran 的接口更容易。

于 2012-08-25T15:17:31.023 回答