鉴于此功能
void printMatrix(int *m, int ze, int sp)
现在* m应该是一个二维数组(或者更像是指向二维数组的指针)。
那么如何将此*m
用作m[][]
?
答案 0 :(得分:3)
可变长度数组可以帮助您:
int (*p)[sp] = (void*) m;
现在您可以通过p[i][j]
访问元素。
关于严格别名规则的强制定义:它是有效的,因为m
和p
都指向兼容的类型。
答案 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数组,那么当然是最好的。