Scusami, ma ero impegnato e non ti ho potuto rispondere prima di adesso. Eccoti del codice di esempio, puoi studiarlo e modificarlo per capire meglio:
codice:
#include <stdio.h>
#include <stdbool.h>

#define N 5
#define M 3

int main(int argc, char **argv) {
	int j, k;
	int mat[N][M];
	int *p_mat = (int *)mat;
	int tmp;
	bool change;
	//inserimento dati
	printf("Inserire una matrice di %ux%u elementi:\n", N, M);
	for(j = 0; j < N; j++) {
		for(k = 0; k < M; k++) {
			scanf("%d", &mat[j][k]);
		}
	}
	while(getchar() != '\n'); //pulisce il buffer dopo la lettura con scanf
	//stampa dati
	printf("\n\n");
	for(j = 0; j < N; j++) {
		for(k = 0; k < M; k++) {
			printf("%d ", mat[j][k]);
		}
		printf("\n");
	}
	//ordinamento dati
	for(j = N*M - 1, change = false; j > 0; j--) {
		for(k = 0; k < j; k++) {
			if(p_mat[k] > p_mat[k+1]) {
				tmp = p_mat[k];
				p_mat[k] = p_mat[k+1];
				p_mat[k+1] = tmp;
				change = true;
			}
		}
		if(!change) break;
	}
	//stampa dati
	printf("\n\n");
	for(j = 0; j < N; j++) {
		for(k = 0; k < M; k++) {
			printf("%d ", mat[j][k]);
		}
		printf("\n");
	}
	
	//alternativa di inserimento puramente dimostrativa
	printf("\n\n");
	printf("Inserire una matrice di %ux%u elementi:\n", N, M);
	for(j = 0; j < N; j++) {
		for(k = 0; k < M; k++) {
			scanf("%d", &p_mat[j*M+k]);
		}
	}
	while(getchar() != '\n');
	printf("\n\n");
	for(j = 0; j < N; j++) {
		for(k = 0; k < M; k++) {
			printf("%d ", mat[j][k]);
		}
		printf("\n");
	}
	for(j = N*M - 1, change = false; j > 0; j--) {
		for(k = 0; k < j; k++) {
			if(p_mat[k] > p_mat[k+1]) {
				tmp = p_mat[k];
				p_mat[k] = p_mat[k+1];
				p_mat[k+1] = tmp;
				change = true;
			}
		}
		if(!change) break;
	}
	printf("\n\n");
	for(j = 0; j < N; j++) {
		for(k = 0; k < M; k++) {
			printf("%d ", mat[j][k]);
		}
		printf("\n");
	}
	getchar();
	return 0;
}