Skip to content

Latest commit

 

History

History
98 lines (79 loc) · 2.66 KB

#21 Matrizes Dinâmicas.md

File metadata and controls

98 lines (79 loc) · 2.66 KB

21 Matrizes Dinâmicas

  • Matrizes Dinâmicas são feitas utilizando ponteiros de ponteiros
  int **m = NULL;
  int nrows = 2;
  int ncols = 3;

  m = calloc(nrows, sizeof(int*));

  for(int i=0; i < nrows; i++) {
    m[i] = calloc(ncols, sizeof(int));
  }
Linha Memóra Variável Valor
Memória Stack
1 0x0 **m NULL
2 0x8 nrows 2
3 0x12 ncols 3
4 0x0 **m 0h0
5 0x16 i 0
7 0x16 i 1
9 0x16 i 2
Memória Heap
4 0h0 *m[0] NULL
4 0h8 *m[1] NULL
6 0h0 *m[0] 0h16
6 0h16 m[0][0] 0
6 0h20 m[0][1] 0
6 0h24 m[0][2] 0
8 0h8 *m[1] 0h28
8 0h28 m[1][0] 0
8 0h32 m[1][1] 0
8 0h36 m[1][2] 0
  • Note que se a matriz é um ponteiro de ponteiro de inteiro, ela deve receber o endereço do tipo ponteiros de inteiros
  • Na sequência, para cada linha (nrows), é alocado um endereço do tipo inteiro, sendo que é este que irá receber o valor que iremos armazenar na matriz e sua quantidade é dada pela quantidade de colunas (ncols)

Em resumo

A matriz possui linhas e colunas, cada linha conterá um "vetor" e como sabemos um vetor dinâmico é criado a partir de um ponteiro, a quantidade de casas que esse vetor conterá é dada pela quantidade de colunas (ncols)

#include <stdio.h>
#include <stdlib.h>

void print_matriz(int **m, int len){
    for(int i=0; i < len; i++){
       printf("&m[%d]: %p | m[%d]: %p \n",i, &m[i], i, m[i]);
    }
    puts("");
}

void print_values_matriz(int **m, int nrows, int ncols){
    for(int i=0; i < nrows; i++)
      for(int j=0; j < ncols; j++)
        printf("&m[%d][%d]: %p | m[%d][%d]: %d \n",i, j, &m[i][j], i, j, m[i][j]);

    puts("");
}

void free_matriz(int** *m, int nrows) {
    int **aux = *m;
    for(int i=0; i < nrows; i++){
        free(aux[i]);
    }
    free(aux);
    *m = NULL;
}

int main() {
  int **m = NULL;
  int nrows = 2;
  int ncols = 3;

  m = calloc(nrows, sizeof(int*));
  printf("&m: %p | m: %p \n\n", &m, m);

  for(int i=0; i < nrows; i++) {
      m[i] = calloc(ncols, sizeof(int));
  }
  print_matriz(m, nrows);

  for(int i=0; i < nrows; i++) {
      for(int j=0; j < ncols; j++)
        m[i][j] = (i+j)*10;
  }
  print_values_matriz(m, nrows, ncols);

  free_matriz(&m, nrows);

  return 0;
}