如何将指针传递给C中的多维数组?

时间:2016-05-08 07:21:02

标签: c matrix multidimensional-array

我有一个二维数组,可以使用函数:

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]) {
    //...
}

我收到不兼容的指针类型错误。我对此无能为力。

4 个答案:

答案 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创建矩阵的示例。