Alocar_vetor_real (a);... /* outros comandos, utilizando p[] normalmente */p = Liberar_vetor_real (p);}Alocacao Dinamica de MatrizesA alocacao dinamica de memoria para matrizes e realizada da mesma forma que paravetores, com a diferenca que teremos um ponteiro apontando para outro ponteiro que apontapara o valor final, ou seja e um ponteiro para ponteiro, o que e denominado indirecao multipla.A indirecao multipla pode ser levada a qualquer dimensao desejada, mas raramente enecessario mais de um ponteiro para um ponteiro. Um exemplo de implementacao para matrizreal bidimensional e fornecido a seguir. A estrutura de dados utilizada neste exemplo ecomposta por um vetor de ponteiros (correspondendo ao primeiro indice da matriz), sendo quecada ponteiro aponta para o inicio de uma linha da matriz. Em cada linha existe um vetoralocado dinamicamente, como descrito anteriormente (compondo o segundo indice da matriz).97#include <stdio.h>#include <stdlib.h>float **Alocar_matriz_real (int m, int n){float **v; /* ponteiro para a matriz */int i; /* variavel auxiliar */if (m < 1 || n < 1) { /* verifica parametros recebidos */printf ("** Erro: Parametro invalido **\n");return (NULL);}/* aloca as linhas da matriz */v = (float **) calloc (m, sizeof(float *)); / Um vetor de m ponteiros para float */if (v == NULL) {printf ("** Erro: Memoria Insuficiente **");return (NULL);}/* aloca as colunas da matriz */for ( i = 0; i < m; i++ ) {v[i] = (float*) calloc (n, sizeof(float)); /* m vetores de n floats */if (v[i] == NULL) {printf ("** Erro: Memoria Insuficiente **");return (NULL);}}return (v); /* retorna o ponteiro para a matriz */}float **Liberar_matriz_real (int m, int n, float **v){int i; /* variavel auxiliar */if (v == NULL) return (NULL);if (m < 1 || n < 1) { /* verifica parametros recebidos */printf ("** Erro: Parametro invalido **\n");return (v);}for (i=0; i<m; i++) free (v[i]); /* libera as linhas da matriz */free (v); /* libera a matriz (vetor de ponteiros) */return (NULL); /* retorna um ponteiro nulo */}void main (void){float **mat; /* matriz a ser alocada */int l, c; /* numero de linhas e colunas da matriz */int i, j;... /* outros comandos, inclusive inicializacao para l e c */mat = Alocar_matriz_real (l, c);for (i = 0; i < l; i++)for ( j = 0; j < c; j++)mat[i][j] = i+j;98... /* outros comandos utilizando mat[][] normalmente */mat = Liberar_matriz_real (l, c, mat);...}AUTO AVALIACAOVeja como voce esta. Faca um programa que multiplique duas matrizes. O programadevera estar estruturado de maneira que:1- o usuario forneca as dimensoes das matrizes (teste se as dimensoes sao compativeis, istoe, se as matrizes podem ser multiplicadas);2- as matrizes sejam alocadas dinamicamente (voce pode usar a funcao vista nesta paginapara isto);3- as matrizes sejam lidas pelo teclado (faca uma funcao para leitura das matrizes);4- as matrizes sejam, entao, multiplicadas (faca uma funcao para a multiplicacao);5- a matriz resultante seja apresentada em tela (faca uma funcao para apresentar a matriz natela).OBS:a) Faca, tambem, alocacao dinamica da matriz resultante.b) Caso alguem nao conheca o procedimento para a multiplicacao de matrizes, segue aquialguma orientacao. Suponha as matrizes A(mXn)| a11 a12 ... a1n |A = | a21 a22 ... a2n || : || am1 am2