Uma matriz, ou array bidimensional, é uma estrutura de dados semelhante aos vetores, porém contendo duas dimensões, linhas e colunas. Dizendo em outras palavras, uma matriz é um conjunto de elementos em que, para acessar cada um dos elementos é preciso informar duas coordenadas, os índices da linha e da coluna, da posição que se deseja acessar, como apresentado na figura a seguir.

O processo para criar uma matriz dinâmica com a linguagem de programação C não é muito complicado, contudo exige algum conhecimento de ponteiros, uma vez que uma matriz dinâmica nada mais é que um vetor de vetores, como apresentado na figura a seguir.

Explicando. Para criar um vetor com capacidade para 10 inteiros com alocação dinâmica de memória escrevemos a seguinte linha:
int *meuVetor = malloc(sizeof(int) * 10);
ou seja, alocamos memória para 10 inteiros e o endereço inicial desta região de memória é retornado e salvo na variável meuVetor, que é um ponteiro.
Para criar uma matriz dinâmica 5 por 7 por exemplo, devemos primeiro criar um vetor de ponteiros. Isso pode ser feito com a linha a seguir (observe que há um detalhe no operador sizeof que faz toda a diferença):
int **minhaMatriz = malloc(sizeof(int*) * 5);
Assim, alocamos memória para 5 PONTEIROS para inteiros. O endereço inicial desta região de memória é salvo na variável minhaMatriz. Esta variável possui dois * por dois motivos:
1º – Guarda um endereço de memória;
2º – A região de memória apontada por esse endereço também irá guardar um endereço de memória.
Feito isso. É necessário agora alocar um vetor de tamanho 7 para cada posição da variável minhaMatriz, como feito a seguir:
minhaMatriz[i] = malloc(sizeof(int) * 7);
Dessa forma, temos um vetor de tamanho 5 que, cada posição guarda o endereço de outro vetor de tamanho 7, ou seja, uma matriz com 5 linhas e 7 colunas.
No vídeo a seguir apresento uma videoaula construindo uma matriz dinâmica. O código completo escrito encontra-se a seguir.
Matriz dinâmica com a linguagem de programação C
#include <stdio.h>
#include <stdlib.h>
// recebe uma matriz nos molde tradicionais, informando dimenções de linha e coluna
void imprimir(int mat[3][3]){
int linha, coluna;
printf("Imprimindo a matriz:\n");
for(linha = 0; linha < 3; linha++){
for(coluna = 0; coluna < 3; coluna++)
printf("%d ", mat[linha][coluna]);
printf("\n");
}
}
// recebe o ponteiro para uma matriz
void imprimir2(int **mat){
int linha, coluna;
printf("Imprimindo a matriz:\n");
for(linha = 0; linha < 3; linha++){
for(coluna = 0; coluna < 3; coluna++)
printf("%d ", *(*(mat + linha) + coluna));// imprime a matriz por meio de aritmética de ponteiros
//printf("%d ", mat[linha][coluna]);// imprime a matriz usando os colchetes
printf("\n");
}
}
int main() {
int i, linha, coluna, mat[3][3];
int **mat2;
// aloca um vetor para guardar 3 ponteiros para inteiros
mat2 = malloc(3 * sizeof(int*));
for(i = 0; i < 3; i++)
mat2[i] = malloc(3 * sizeof(int));// aloca um vetor de inteiros de tamanho 3
for(linha = 0; linha < 3; linha++){
for(coluna = 0; coluna < 3; coluna++){
printf("Digite o elemento %d %d: ", linha, coluna);
//scanf("%d", &mat[linha][coluna]);
//scanf("%d", &mat2[linha][coluna]);
scanf("%d", *(mat2 + linha) + coluna);// aritmética de ponteiros
}
}
//imprimir(mat);
imprimir2(mat2);
return 0;
}
Ficou com alguma dúvida? Use a seção abaixo de comentários. Será um prazer ajudar. Se gostou do conteúdo, nos ajude compartilhando com seus amigos. Abraços e até o próximo.
