将指针转换为二维数组

时间:2017-01-17 15:39:16

标签: c arrays pointers multidimensional-array

鉴于此功能

void printMatrix(int *m, int ze, int sp)

现在* m应该是一个二维数组(或者更像是指向二维数组的指针)。

那么如何将此*m用作m[][]

4 个答案:

答案 0 :(得分:3)

可变长度数组可以帮助您:

int (*p)[sp] = (void*) m;

现在您可以通过p[i][j]访问元素。

See it live on Coliru

关于严格别名规则的强制定义:它是有效的,因为mp都指向兼容的类型。

答案 1 :(得分:2)

你不能,因为m只能被解除引用一次。但是,如果您知道数组的维数,则可以将1D索引计算为

element[i][j]=m[i * width + j];

答案 2 :(得分:1)

如果m确实是指向2D矩阵的指针,您可以这样声明参数:

void printMatrix(int rows, int cols, int m[rows][cols]) {
    ...
}

答案 3 :(得分:0)

你将不得不假设它是一个所谓的“受损”阵列。在这种情况下,您可以创建一个新阵列作为VLA:

void printMatrix(int *m, int ze, int sp)
{
  int array[ze][sp];
  memcpy(array, m, sizeof(int[ze][sp]));
}

或者可能是动态分配的2D数组:

void printMatrix(int *m, int ze, int sp)
{
  size_t size = sizeof(int[ze][sp]);
  int (*array)[sp] = malloc(size);
  memcpy(array, m, size);
  ...
}

然而,将int*转换为数组指针类型是一个值得怀疑的做法,这将导致指针别名问题。当然,如果您可以重写函数原型以正确使用2D数组,那么当然是最好的。

相关问题