Matriz de punteros a matrices

Soy nuevo en la progtwigción de C y este es mi problema:

Quiero almacenar el primer valor de cada matriz en una nueva matriz, luego el segundo valor de cada matriz en una nueva matriz y así sucesivamente.

Podría declarar el conjunto de punteros, pero no sé cómo lo uso.

Por favor necesito ayuda.

int main() { int t1[4]={0,1,2,3}; int t2[4]={4,5,6,7}; int t3[4]={8,9,10,11}; int t4[4]={12,13,14,15}; int *tab[4]={t1,t2,t3,t4}; int i,j,k,l; for (i=0; i<4;i++) { printf("%d\t", *tab[i]); } return 0; } 

Cuando hago esto, almaceno solo el primer valor de cada matriz.

Su terminología es un poco por todo el lugar. Creo que la forma más fácil de responder a su pregunta es revisar su código línea por línea.

 int main() { int t1[4]={0,1,2,3}; //Declares a 4 integer array "0,1,2,3" int t2[4]={4,5,6,7}; //Declares a 4 integer array "4,5,6,7" int t3[4]={8,9,10,11}; //Declares a 4 integer array "8,9,10,11" int t4[4]={12,13,14,15}; //Declares a 4 integer array "12,13,14,15" int *tab[4]={t1,t2,t3,t4};//Declares a 4 pointer of integers array "address of the first element of t1, address of the first element of t2, ..." int i,j,k,l; //Declares 4 integer variables: i,j,k,l for (i=0; i<4;i++) { printf("%d\t", *tab[i]); //print out the integer that is pointed to by the i-th pointer in the tab array (ie t1[0], t2[0], t3[0], t4[0]) } return 0; } 

Todo lo que estás haciendo parece bien hasta tu bucle. Solo está mostrando el primer entero de cada matriz porque no los está atravesando. Para iterar sobre ellos, tu código debería verse así:

 for (i=0; i<4;i++) { for (j=0; j<4; j++) { printf("%d\t", *(tab[j] + i)); } } 

El código anterior utiliza dos contadores de bucle, uno (el i ) para recorrer las posiciones en la matriz (primer valor en la matriz, segundo valor en la matriz, etc.); La otra para ir a través de las diferentes matrices (la j ). Para ello, recupera el puntero almacenado en la tab[j] y crea un nuevo puntero que tiene el desplazamiento correcto para mostrar el valor de la columna i th. Esto se denomina aritmética de punteros (aquí hay información adicional sobre la aritmética de punteros)

La mayoría de la gente considera que la syntax *(tab[j] + i) es torpe, pero es más descriptiva de lo que realmente está sucediendo. En C, puedes reescribirlo como tab[j][i] , que es mucho más habitual.

Ha almacenado los datos como deseaba, solo necesita acceder a ellos correctamente

 for (i=0; i<4;i++) { for (j = 0; j < 4; j++) { int* temp = tab[i]; printf("%d\t", temp[j]); // or try the next line... printf("%d\t", *(temp + j)); // prints same value as above line printf("%d\t", tab[i][j]; // the same value printed again } } 

Todo lo anterior imprime el mismo valor, son solo formas diferentes de acceder a ese valor utilizando aritmética de punteros. Cada elemento de tab es un int* el valor de cada uno es la dirección de sus otros arreglos int[] definidos al comienzo

Edit: En respuesta al comentario de Jerome, puedes lograr eso declarando 4 arrays

 int tab1[4]={*t1,*t2,*t3,*t4}; int tab2[4]={*(t1+1),*(t2+1),*(t3+1),*(t4+1)}; int tab3[4]={*(t1+2),*(t2+2),*(t3+2),*(t4+2)}; int tab4[4]={*(t1+3),*(t2+3),*(t3+3),*(t4+3)}; 

Ahora tab1 contiene los primeros elementos de cada matriz, tab2 los segundos elementos, y así sucesivamente. Entonces puedes usar

  int *tttt[4]={tab1,tab2,tab3,tab4}; for (i=0; i<4;i++) { for (j = 0; j < 4; j++) { printf("%d\t", tttt[i][j]); } } 

para imprimir lo que querias Si declaraste otra matriz de punteros como hiciste al principio

  int* tab[4] = {t1,t2,t3,t4}; 

luego esencialmente en términos matriciales, tttt es la transposición de la tab

Lo guardas todo, pero no lo muestras. Tratar

 for (i=0; i<4;i++) { for (j=0; j<4; j++) printf("%d\t", *(tab[i]+j)); }