Pasar un puntero que representa una matriz 2D a una función en C ++

http://www.neilstuff.com/guide_to_cpp/notes/Multi%20Dimension%20Arrays%20and%20Pointer%20Pointers.htm

Según este sitio, debería poder usar el siguiente código:

double stuff[3][3]; double **p_stuff; p_stuff = stuff; 

Pero recibo una queja de que la conversión no está permitida por asignación.

¿Estoy haciendo algo mal?

Tengo una función de tipo “C” externa a la que quiero pasar este material doble [3] [3]. Así que creo que necesito que sea un puntero, ¿verdad?

En cuanto a la edición: para pasar esta double stuff[3][3] a una función C, podrías

1) pasa un puntero a toda la matriz 2D:

 void dostuff(double (*a)[3][3]) { // access them as (*a)[0][0] .. (*a)[2][2] } int main() { double stuff[3][3]; double (*p_stuff)[3][3] = &stuff; dostuff(p_stuff); } 

2) pasar un puntero a la primera matriz 1D (primera fila) y el número de filas

 void dostuff(double a[][3], int rows) { // access them as a[0][0] .. a[2][2] } int main() { double stuff[3][3]; double (*p_stuff)[3] = stuff; dostuff(p_stuff, 3); } 

3) pasar un puntero al primer valor en la primera fila y el número de columnas y filas

 void dostuff(double a[], int rows, int cols) { // access them as a[0] .. a[8]; } int main() { double stuff[3][3]; double *p_stuff = stuff[0]; dostuff(p_stuff, 3, 3); } 

(que esta última opción no es estrictamente conforme a los estándares ya que avanza un puntero a un elemento de una matriz 1D (la primera fila) más allá del final de esa matriz)

Si esa no fuera una función C, ¡habría algunas opciones más!

Tu asignado es defectuoso. p_stuff; es puntero al puntero al double mientras que el stuff es una matriz bidimensional (matriz de matrices)

Una matriz de una dimensión se desintegra al puntero a su primer elemento. Una matriz bidimensional se desintegra a un puntero a una matriz de una sola dimensión.

Prueba esto

 double stuff[3][3]; double (*p_stuff)[3]; // pointer to array of 3 int p_stuff = stuff; 

double ** p_stuff; corresponde a una matriz de puntero a doble . double stuff[3][3] no tienen punteros, es una matriz 2D de doble.

Debajo está quizás tu respuesta:

 #include  #include  typedef unsigned int uint; uint m[10][20]; uint **ppm; int main() { int i; ppm = (uint **)m; for (i =0; i<10; ++i)ppm[i] = (uint *)&m[i]; m[1][1] = 10; printf("0x%x vs 0x%x: %d vs %d\n", ppm,m, m[1][1], *(*(ppm+1)+1)); return 0; } 

El resultado está en la pantalla de la consola:

 0x6010a0 vs 0x6010a0: 10 vs 10 

Además de la respuesta detallada de Cubbi, de la siguiente manera es natural pasar una matriz de 2 dim a una función:

 void dostuff(void *a1, int rows, int cols) { double (*a)[cols] = (double (*)[cols]) a1; // access them as a[0][0] .. a[rows-1][cols-1]; } int main() { double stuff[3][3]; dostuff(stuff, 3, 3); } 

No es necesario que los lances con anticipación, ya que el último C ++ (C ++ 14) admite matrices de tamaño de tiempo de ejecución.