A continuación, os pongo el ejemplo que se me ha ocurrido más completo sobre gestión de Matrices en C que reúne los ejemplos que he ido poniendo anteriormente.

#include <stdio.h>;
#include <stdlib.h>;
void Ingresa_Matriz (int m[3][3], int f, int c);
void Utiliza_Matriz (int m[3][3], int f, int c);
void Visualiza_Matriz (int m[3][3], int f, int c);
void Rota_Matriz_D (int m[3][3], int f, int c);
void Rota_Matriz_I (int m[3][3], int f, int c);
void Multiplica_Matriz (int m[3][3], int f, int c, int cf, int *m0, int *m1, int *m2);
int main () {
char ingresa;
int m[3][3], cf = 0, direccion = 0, f = 0, c = 0;
int m0, m1, m2;
printf ("Deseas ingresar Matriz o utiliza la maqueta <I/M>: ");
scanf ("%c",&ingresa);
if (ingresa == 'i') {
Ingresa_Matriz(m, f, c);
} else {
Utiliza_Matriz(m, f, c);
}
Visualiza_Matriz(m, f, c);
printf ("\nDeseas rotar la matriz a la derecha <1> o a la izquierda <0>: ");
scanf ("%d",&direccion);
if (direccion == 1) {
Rota_Matriz_D (m, f, c);
} else {
Rota_Matriz_I (m, f, c);
}
Visualiza_Matriz(m, f, c);
printf ("\n¿Quieres multiplicar las filas (1) o las columnas (0)?: ");
scanf ("%d",&cf);
Multiplica_Matriz(m, f, c, cf, &m0, &m1, &m2);
if (cf == 1) {
printf ("\nMultiplicacion Fila 0: %d",m0);
printf ("\nMultiplicacion Fila 1: %d",m1);
printf ("\nMultiplicacion Fila 2: %d",m2);
} else {
printf ("\nMultiplicacion Columna 0: %d",m0);
printf ("\nMultiplicacion Columna 1: %d",m1);
printf ("\nMultiplicacion Columna 2: %d",m2);
}
return 0;
}
void Ingresa_Matriz (int m[3][3], int f, int c) {
for (f=0;f<3;++f) {
for (c=0;c<3;++c) {
printf ("\nIntroduce posicion [%d][%d]: ",f,c);
scanf ("%d",&m[f][c]);
}
}
}
void Utiliza_Matriz (int m[3][3], int f, int c) {
for (f=0;f<3;++f) {
for (c=0;c<3;++c) {
m[f][c]=rand()%50+1;
}
}
}
void Visualiza_Matriz (int m[3][3], int f, int c) {
for (f=0;f<3;++f) {
for (c=0;c<3;++c) {
printf ("[%d] ",m[f][c]);
} printf ("\n");
}
}
void Rota_Matriz_D (int m[3][3], int f, int c) {
int tmp[3][3];
for (f=0;f<3;++f) {
for (c=0;c<3;++c) {
if (c == 2) {
tmp[f][0]=m[f][c];
} else {
tmp[f][c+1]=m[f][c];
}
}
}
for (f=0;f<3;++f) {
for (c=0;c<3;++c) {
m[f][c]=tmp[f][c];
}
}
}
void Rota_Matriz_I (int m[3][3], int f, int c) {
int tmp[3][3];
for (f=0;f<3;++f) {
for (c=0;c<3;++c) {
if (c == 0) {
tmp[f][2]=m[f][c];
} else {
tmp[f][c-1]=m[f][c];
}
}
}
for (f=0;f<3;++f) {
for (c=0;c<3;++c) {
m[f][c]=tmp[f][c];
}
}
}
void Multiplica_Matriz (int m[3][3], int f, int c, int cf, int *m0, int *m1, int *m2) {
// 1 Multiplica filas
// 0 Multiplica columnas
int c0[3], c1[3], c2[3];
if (cf == 0) {
printf ("\nMultiplicando columnas...\n\n");
for (f=0;f<3;++f) {
for (c=0;c<3;++c) {
if (c == 0)
c0[f]=m[f][c];
if (c == 1)
c1[f]=m[f][c];
if (c == 2)
c2[f]=m[f][c];
}
}
} else {
printf ("\nMultiplicando filas...\n\n");
for (f=0;f<3;++f) {
for (c=0;c<3;++c) {
if (f == 0)
c0[c]=m[f][c];
if (f == 1)
c1[c]=m[f][c];
if (f == 2)
c2[c]=m[f][c];
}
}
}
*m0=c0[0]*c0[1]*c0[2];
*m1=c1[0]*c1[1]*c1[2];
*m2=c2[0]*c2[1]*c2[2];
}