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.