通过指针传递二维数组
如何将m矩阵传递给foo()? 如果我不被允许更改代码或foo()的原型?
void foo(float **pm) { int i,j; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) printf("%f\n", pm[i][j]); } int main () { float m[4][4]; int i,j; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) m[i][j] = i+j; foo(???m???); }
如果你坚持上述foo
声明,即
void foo(float **pm)
并使用内置的2D数组,即
float m[4][4];
那么使你的foo
与m
一起工作的唯一方法是创建一个额外的“行索引”数组并传递它而不是m
... float *m_rows[4] = { m[0], m[1], m[2], m[3] }; foo(m_rows);
没有办法直接将m
传递给foo
。 是不可能的。 参数类型float **
与参数类型float [4][4]
无可救药地不兼容。
而且,由于C99以上可以以更紧凑的方式表达
foo((float *[]) { m[0], m[1], m[2], m[3] });
PS如果仔细观察,你会发现这与Carl Norum在答案中建议的基本相同。 除了Carl是malloc
-ing数组内存,这不是绝对必要的。
如果你不能改变foo()
,你需要改变m
。 将其声明为float **m
,并适当地分配内存。 然后调用foo()
。 就像是:
float **m = malloc(4 * sizeof(float *)); int i, j; for (i = 0; i < 4; i++) { m[i] = malloc(4 * sizeof(float)); for (j = 0; j < 4; j++) { m[i][j] = i + j; } }
之后别忘了free()
!
你不能。 m
与foo
的参数不兼容。 你必须使用一个临时的指针数组。
int main() { float m[4][4]; int i,j; float *p[4]; p[0] = m[0]; p[1] = m[1]; p[2] = m[2]; p[3] = m[3]; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) m[i][j] = i+j; foo(p);
如果您的编译器支持当前的C标准C99,那么您可以这样做:
foo((float *[]){ m[0], m[1], m[2], m[3] });
(请注意,这与AndreyT的答案完全相同,只是它放弃了必须命名临时数组)
-
您不需要在main中进行任何更改,但如果将函数的正式原型更改为(* pm)[4]或pm [] [4],则函数将正常工作,因为** pm表示指向指针的指针整数while(* pm)[4]或pm [] [4]表示指向4个整数的poiner的指针。
这里的m也是指向4个整数的指针,而不是指向整数指针的指针,因此不兼容。
#include
void foo(float (*pm)[4]) { int i,j; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) printf("%f\n", pm[i][j]); } int main () { float m[4][4]; int i,j; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) m[i][j] = i+j; foo(m); }
foo(m)
不起作用吗?
void foo(float **pm)
与void foo(float *pm[])
,它不是浮点数的二维数组。 它是一个float*
数组。 现在,那些float*
本身可能指向浮点数组,但这是一个单独的问题。
typedef float Float4[4]; void foo(Float4 *pm) { int i,j; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) printf("%f\n", pm[i][j]); } main() { Float4 m[4]; int i,j; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) m[i][j] = i+j; foo(m); return 0; }
使用支持运行时大小的数组的C99,以下是传递2-dim数组的可能方法:
void foo(void *pm, int row, int col) { float (*m)[col] = pm; for (int i = 0; i < row; i++) for (int j = 0; j < col; j++) printf("%4.1f%s", m[i][j], (j == col-1)?"\n":" "); } int main() { float m[4][4]; for (int i = 0; i < 4; i++) for (int j = 0; j < 4; j++) m[i][j] = i+j; foo(m, 4, 4); return 0; }