如果你想实现一个二维数组;您更喜欢以下哪种技术
1.Row Major/Col Major 2.指针数组
在本书Numerical Recipes in C
(在线版)中,您可以在第 20-23 页找到一章,讨论它们如何实现二维数组。
如果二维数组的使用在多个函数中,或者大小太大,那么我们可以使用指针变量动态分配二维数组,如下所示。
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
当然,指针数组方法提供了很好的语法优势,即能够以良好的旧 C 语法(即 a[3][4])寻址数组的元素。并且,如果适合您的项目,它允许每行具有不同的长度。但是,我认为内存管理不值得付出努力,并且可能会影响性能,因为每次访问都需要两个取消引用步骤。假设您正在分配行,您可以将它们视为 C 数组,它们就是这样,并优化性能,但必须始终以方便但缓慢的方式对列进行索引。
至于单一分配方法中的行或列主顺序,这完全取决于您要做什么。如果您更有可能需要连续的行,请使用主要行。如果您正在做线性代数,则更常见的是要使用列,因此列专业更方便。
我已经用数值软件做了大量的工作,发现单一分配方法最适合我。我通常使用列专业,因为与 Fortran 的接口更容易。