我有一个二维数组,可以使用函数:
bool matrix[rows][cols];
func(rows, cols, matrix);
void func(int rows, int cols, bool matrix[rows][cols]) {
//...
}
但是,只要我尝试在原始函数中修改matrix
:
bool matrix[rows][cols];
func(rows, cols, &matrix);
void func(int rows, int cols, bool *matrix[rows][cols]) {
//...
}
我收到不兼容的指针类型错误。我对此无能为力。
答案 0 :(得分:7)
bool matrix[rows][cols]
是一个bool
bool* matrix[rows][cols]
是指向bool
或仅bool*
的类型指针数组的数组。
因此,如果您将函数定义为采用类型为bool*
的数组数组,则需要传递该类型:
bool* m[row][col];
func( row , col , m );
如果您想要指向bool matrix[rows][cols]
,那么您的方法就不正确了
指向矩阵的指针的类型为:bool (*pmatrix)[rows][cols]
。因此,使用该类型定义函数并传递矩阵数组的地址:
func( rows , cols , &matrix );
答案 1 :(得分:3)
@2501 has already answered your question,但是,既然您希望将修改后的数组反映到main函数中,那么您实际上并不需要指向数组的指针(这会使事情更复杂) !只需直接传递数组,就可以得到预期的结果!
为什么,你问?
简答:在C中,数组通过引用传递。
答案很长:
始终牢记当您使用数组名称时,它会转换为指向其第一个元素的指针 †。这通常被称为" array decay"。
回到您的代码,bool matrix[rows][cols];
的图表将是:
+---------------------+---------------------+---------------------+---------------------+---------------------+
| | | | | |
| matrix[0][0] | matrix[0][1] | matrix[0][2] | ... | matrix[0][cols - 1] |
| | | | | |
+---------------------+---------------------+---------------------+---------------------+---------------------+
| | | | | |
| matrix[1][0] | matrix[1][1] | matrix[1][2] | ... | matrix[1][cols - 1] |
| | | | | |
+---------------------+---------------------+---------------------+---------------------+---------------------+
| | | | | |
| ... | ... | ... | ... | ... |
| | | | | |
+---------------------+---------------------+---------------------+---------------------+---------------------+
| | | | | |
| matrix[rows - 1][0] | matrix[rows - 1][1] | matrix[rows - 1][2] | ... | matrix[rows - 1][cols - 1] |
| | | | | |
+---------------------+---------------------+---------------------+---------------------+---------------------+
从上图中可以看出,
的第一个元素bool matrix[rows][cols];
是matrix[0][0]
到matrix[0][cols - 1]
的第一个子阵列。那么这里发生的是这个子阵列的地址被传递给函数。这是bool (*)[cols]
类型。这意味着
void func(int rows, int cols, bool matrix[rows][cols])
的工作方式与
相同void func(int rows, int cols, bool (*matrix)[cols])
因此,例如,如果您想要写入matrix
的第二个子阵列的第三个插槽,则可以使用matrix[1][2] = WHATEVER;
,并且从该函数所做的更改也会影响调用者地址已通过。
†:有一些例外,其中数组"衰变"没有发生。见Exception to array not decaying into a pointer?
答案 2 :(得分:0)
指向单维数组的指针,比如int a[10]
,可能如下所示:
int (*ptr)[10]
| |______________array of 10 integers(read type and number together)
|______a pointer to ^
指向多维数组的指针,比如int a[10][10]
,可能如下所示:
int (*ptr)[10][10]
| | |_________________array of 10 integers(read type and number together)
| |______________array of ^
|______a pointer to ^
警告:请注意括号。
*matrix[rows][cols])
与(*matrix)[rows][cols])
不同。 @ 2501在答案中指出了不同之处。
答案 3 :(得分:-3)
您可以使用val mean = data.map(_.toInt).mean()
作为矩阵。
***
char ***matrix = alloc_matrix(BUFFER_SIZE, BUFFER_SIZE);
以下是我们使用char ***alloc_matrix(unsigned rows, unsigned columns) {
char ***matrix = malloc(rows * sizeof(char **));
if (!matrix) abort();
for (unsigned row = 0; row < rows; row++) {
matrix[row] = calloc(columns, sizeof(char *));
if (!matrix[row]) abort();
for (unsigned column = 0; column < columns; column++) {
matrix[row][column] = NULL;
}
}
return matrix;
}
和malloc
创建矩阵的示例。