我需要将多个矩阵(它们的地址)存储在一个数组中,但我无法弄清楚。
我创造了
int* store[SIZE]
善良的东西,但我不确定。
所以如果你有一个数组
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
列。
你需要有一个指向二维数组的指针数组
#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;
}
在询问如何定义矩阵指针数组之前,您必须首先决定如何表示单个矩阵。
在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];
是的,你可以通过多种方式做到这一点。
如果你希望数据在堆中,你要么将你的矩阵变成指向指针的指针,要么进行内存运算
//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]
现在,重要的是在您要声明和使用数组时,请牢记每种方法的局限性、优点和缺点。