2d数组或指针数组

时间:2012-08-25 12:59:17

标签: c visual-c++

如果要实现2D数组;您更喜欢以下哪种技术

1.Row Major / Col Major 2.Array of Pointers

3 个答案:

答案 0 :(得分:2)

在书Numerical Recipes in Conline version)中,您可以在第20-23页找到有关如何实现二维数组的章节。

答案 1 :(得分:1)

如果2D数组的使用是在多个函数中,或者如果太大则使用大小,那么我们可以使用如下的指针变量来动态分配2D数组。

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
    }
}

如果2D数组的使用仅在一个函数内且尺寸不是太大,我们可以选择局部二维数组。因为动态内存分配是一个代价高昂的过程。

int a[ROWSIZE][COLSIZE];

注意:对malloc

进行空检查

答案 2 :(得分:0)

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

对于单一分配方法中的行或列主要顺序,这完全取决于您要执行的操作。如果您更可能需要连续的行,请使用row major。如果您正在进行线性代数,则更常见的是要使用列,因此列主要更方便。

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