通过指针传递二维数组

如何将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]; 

那么使你的foom一起工作的唯一方法是创建一个额外的“行索引”数组并传递它而不是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()

你不能。 mfoo的参数不兼容。 你必须使用一个临时的指针数组。

 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; }