我可以创建一个指向二维数组的指针数组吗?

问题描述 投票:0回答:4

我需要将多个矩阵(它们的地址)存储在一个数组中,但我无法弄清楚。

我创造了

int* store[SIZE]
善良的东西,但我不确定。

arrays c pointers matrix memory
4个回答
1
投票

所以如果你有一个数组

int arr[R][C];

那么 expression

arr
的结果将具有类型

int (*)[C];

因为它不是一元运算符

&
的操作数,并且表达式从类型“
T
的数组”“衰减”到“指向
T
的指针”(其中
T
int [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
列。


0
投票

你需要有一个指向二维数组的指针数组

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

0
投票

在询问如何定义矩阵指针数组之前,您必须首先决定如何表示单个矩阵。

在C中,矩阵可以表示为二维数组,例如:

#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]
来检索矩阵第6th行的第9th列中的元素。

现在,回答你关于如何定义一个指针数组的问题,其中每个指针指向一个矩阵:

假设所有矩阵的维度都相同,那么可以做如下操作:

如果一个单独的矩阵表示为一个二维数组,那么你可以像这样定义一个指向单独矩阵的指针数组:

#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];

0
投票

是的,你可以通过多种方式做到这一点。

如果你希望数据在堆中,你要么将你的矩阵变成指向指针的指针,要么进行内存运算

//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]

现在,重要的是在您要声明和使用数组时,请牢记每种方法的局限性、优点和缺点。

© www.soinside.com 2019 - 2024. All rights reserved.