Passing two-dimensional array via pointer

arrays, c, pointers

Solution

If you insist on the above declaration of `foo`, i.e.

void foo(float **pm)

and on using a built-in 2D array, i.e.

float m[4][4];

then the only way to make your `foo` work with `m` is to create an extra "row index" array and pass it instead of `m`

...
float *m_rows[4] = { m[0], m[1], m[2], m[3] };
foo(m_rows);

There no way to pass `m` to `foo` directly. It is impossible. The parameter type `float **` is hopelessly incompatible with the argument type `float [4][4]`.

Also, since C99 the above can be expressed in a more compact fashion as

foo((float *[]) { m[0], m[1], m[2], m[3] });

P.S. If you look carefully, you'll that this is basically the same thing as what Carl Norum suggested in his answer. Except that Carl is `malloc`-ing the array memory, which is not absolutely necessary.

Problem

How do I pass the m matrix to foo()? if I am not allowed to change the code or the prototype of 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???); } ```

Original source