Exercícios Resolvidos de Alocação dinâmica de memória

Ver Teoria

Enunciado

Utilize um ponteiro duplo para alocar dinamicamente uma matriz com números reais. Os valores de linhas e colunas são obtidos do usuário. Preencha todos os elementos da matriz com 0 e exiba a matriz.

Passo 1

Vamos nessa!

Pessoal, criar uma matriz dinâmica com C++ é uma tarefa um pouco mais complicada. Se você simplesmente tentar usar o operador new com duas chaves, vamos obter um erro:

O que vamos precisar fazer é usar o operador n e w várias vezes consecutivas. A primeira utilização vai criar as linhas da matriz. Depois, dentro de cada linha vamos criar as colunas da matriz.

Passo 2

Vamos começar. Primeiro de tudo, vamos precisar de três variáveis.

Vamos precisar de duas variáveis inteiras para armazenar a quantidade de linhas e colunas.

E também vamos precisar de um ponteiro duplo que vai armazenar o endereço de memória da matriz dinâmica.

E em seguida, vamos precisar receber do usuário a quantidade de linhas e colunas da matriz

Passo 3

Beleza, agora vamos pro coração da questão.

O que vamos fazer aqui é um uso inteligente dos ponteiro. Primeiro, pegar o ponteiro duplo p n t M a t r i z e alocar um “array de ponteiros”. E depois, vamos usar cada um dos ponteiros alocados dinamicamente, e usar esses ponteiros para alocar espaços na memória. O efeito disso será uma matriz.

Primeiro, vamos iniciar as colunas da nossa matriz. Para isso vamos usar o operador n e w     . Uma coisa que você deve notar é que p n t M a t r i z é um ponteiro

E depois vamos acessar cada uma das linhas, e em cada uma delas vamos inicializar a quantidade de colunas:

Na prática, o que fazemos na linha 14 é criar uma “array de ponteiros”. E depois no loop, acessamos cada um dos ponteiros e alocamos um array de f l o a t s . O resultado é que temos uma quantidade l i n h a s de arrays dinâmicos, e cada um desses arrays dinâmicos possui uma quantidade c o l u n a s de espaços.

Por exemplo, se o usuário digitar uma quantidade de 4 linhas, e 5 colunas, vamos ter a seguinte organização na memória:

Passo 4

Prontinho! Nossa matriz dinâmica foi alocada! E pra usar ela é só a gente utilizar as duplas chaves para acessar cada elemento, assim como faríamos com as matrizes que estamos acostumados:

p n t M a t r i z   i n d i c e L i n h a i n d i c e C o l u n a

Então vamos preencher todos os elementos com zeros. Pra isso vamos utilizar um loop aninhado para acessar todas as linhas e colunas.

Faremos um loop externo que vai percorrer as linhas da matriz, e um loop interno que percorre as colunas de cada linha. E para cada posição da matriz vamos preencher com zero:

Passo 5

E agora vamos exibir a matriz!

Vamos fazer um outro loop aninhado igualzinho ao anterior. Mas dessa vez, ao invés de alterar o conteúdo da matriz, vamos exibir o conteúdo.

Faremos um loop externo que vai percorrer as linhas da matriz, e um loop interno que percorre as colunas de cada linha. Um detalhe a mais é que, após terminar o último elemento de uma linha, vamos imprimir um e n d l para saltar uma linha

Passo 6

E antes de finalizar a questão, precisamos liberar a memória alocada dinamicamente.

Perceba o seguinte: se foi necessário usar um loop para alocar a memória, então vai ser preciso um loop para liberar a memória também!

Vamos acessar cada uma das linhas da matriz, e liberar o vetor dinâmico existente nesta coluna.

Na prática, o que estamos fazendo é acessando cada um dos ponteiros da “array de ponteiro” e liberando a memória apontada por estes ponteiros.

E antes de finalizar totalmente a questão, lembre-se que a “array de ponteiros” foi alocada dinamicamente também. Então é necessário liberá-la:

E prontinho! Questão concluída.

Resposta