C语言 我可以创建一个指向2D数组的指针数组吗?

ehxuflar  于 2023-05-16  发布在  其他
关注(0)|答案(4)|浏览(109)

我需要在一个数组中存储多个矩阵(它们的地址),但我无法弄清楚。
我创建了int* store[SIZE]之类的东西,但我不确定。

eqfvzcg8

eqfvzcg81#

所以如果你有一个数组

int arr[R][C];

那么 expressionarr的结果将具有类型

int (*)[C];

因为它不是一元&运算符的操作数,并且表达式“decay”从类型“array of T“到“pointer to T“(其中Tint [C]),而表达式&arr的结果将具有类型

int (*)[R][C];

所以这里有两条路。第一种方式是:

int (*ptrs[])[C] = { arr, another_arr, yet_another_arr, ... };

int (*ptrs[N])[C];

ptrs[0] = arr;
ptrs[1] = another_arr;
ptrs[2] = yet_another_arr;
...

所有指向的数组都必须有C列,但它们可能有不同的行数(不过,您必须单独存储这些信息)。
或者,您可以使用

int (*ptrs[])[R][C] = { &arr, &another_arr, &yet_another_arr ... };

int (*ptrs[N])[R][C];

ptrs[0] = &arr;
ptrs[1] = &another_arr;
ptrs[2] = &yet_another_arr;
...

在这种情况下,所有指向的数组必须具有R行和C列。

2o7dmzc5

2o7dmzc52#

你需要一个指向2D数组的指针数组

#define ARRAY_SIZE 100
#define ROWS    10
#define COLS    20

int (*array[ARRAY_SIZE])[COLS]; //this one is actually array of pointers to 1D array.

// or

int (*array1[ARRAY_SIZE])[ROWS][COLS];

使用方法:

int main(void)
{
    int arr[ROWS][COLS];

    array[0] = arr;
    array1[0] = &arr;

    array[0][5][3] = 5;
    (*array1[0])[5][3] = 5;
}
af7jpaap

af7jpaap3#

在询问如何定义一个指向矩阵的指针数组之前,你必须首先决定如何表示一个独立的矩阵。
在C中,矩阵可以表示为2D数组,例如像这样:

#define NUM_ROWS 20
#define NUM_COLS 10

int matrix[NUM_ROWS][NUM_COLS];

矩阵也可以表示为指针数组,其中每个指针指向int数组的第一个元素。这些数组表示矩阵的各个行。下面是一个例子:

#define NUM_ROWS 20
#define NUM_COLS 10

int *matrix[NUM_ROWS];

在这两种情况下,都可以使用表达式matrix[5][8]来检索矩阵第6行第9列中的元素。
现在,来回答你关于如何定义一个指针数组,其中每个指针指向一个矩阵的问题:
假设所有矩阵的维数都是相同的,那么你可以做以下事情:
如果一个单独的矩阵表示为一个2D数组,那么你可以定义一个指向单独矩阵的指针数组,如下所示:

#define NUM_ROWS 20
#define NUM_COLS 10
#define NUM_MATRIXES 30

int (*matrixes[NUM_MATRIXES])[NUM_COLS];

如果一个单独的矩阵被表示为指向矩阵各行的指针数组,那么你可以定义一个指向单独矩阵的指针数组,如下所示:

#define NUM_ROWS 20
#define NUM_COLS 10
#define NUM_MATRIXES 30

int **matrixes[NUM_MATRIXES];
oxiaedzo

oxiaedzo4#

是的,你可以用不同的方式来做。
如果您希望数据在堆中,您将把矩阵转换为指向指针的指针,或者执行内存算术

//Pointer to pointer
int*** array_of_pointer_for_2d_array = (int***)malloc(w*sizeof(int**));
array_of_pointer_for_2d_array[0] = (int**)malloc(y*sizeof(int*));
array_of_pointer_for_2d_array[0][0] = (int*)malloc(x*sizeof(int));
array_of_pointer_for_2d_array[0][0][0] = data;

//Pointer arithmetic
int** pointer_to_2d = (int**)malloc(a*sizeof(int*));
pointer_to_2d[0] = (int*)malloc((x*y)*sizeof(int));
int requested_data = pointer_to_2d[0][(z*y)+w];

现在在堆栈中,是这样的:

int(*pointer)[x][y];

data = (*pointer)[w][z]

现在,重要的是,在您想要声明和使用数组时,请记住每个方法的限制、优点和缺点。

相关问题