1
resposta

[Dúvida] Ponteiros ou arrays?

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

int main(){
    int** matriz;
    int linhas = 5;
    int colunas = 10;

    matriz = malloc(sizeof(int*) * linhas); 
    for (int i = 0; i < linhas; i++){
        matriz[i] = malloc(sizeof(int) * (colunas + 1));
    }

    int aux = 0;

    for(int i = 0; i < linhas; i++){
        for(int j = 0; j < colunas; j++){
            matriz[i][j] = aux;
            printf("%d ", matriz[i][j]);
            aux++;     
        }
        printf("\n");
    }
    
    for (int i = 0; i < linhas; i++){
        free(matriz[i]);
    }
    free(matriz);
}

Fiquei com uma dúvida neste seguinte trecho do código:

matriz = malloc(sizeof(int*) * linhas);    //Dúvida
    for (int i = 0; i < linhas; i++){
        matriz[i] = malloc(sizeof(int) * (colunas + 1)); //Dúvida
    }
  1. Por que é necessário colocar o asterisco em int* na linha do ponteiro "matriz", mas não é necessário quando vai preencher os ponteiros com outros ponteiros?
  2. As "linhas" e "colunas" são ponteiros ou arrays? Se forem ponteiros, nessa memória alocada eles estão dispostos assim como os elementos do array ficam "um do lado do outro (endereços vizinhos)" na memória?
1 resposta

Olá, João! Como vai?

Vamos às suas dúvidas:

  1. Na linha em que você declara o ponteiro "matriz", é necessário colocar o asterisco (*) antes de "int" porque você está declarando um ponteiro para ponteiro de inteiros. Ou seja, você está criando um ponteiro que aponta para outros ponteiros que, por sua vez, apontam para inteiros. Já na linha em que você preenche os ponteiros com outros ponteiros, você está atribuindo o endereço de memória retornado pela função malloc, que já é um ponteiro. Por isso, não é necessário colocar o asterisco.

  2. As variáveis "linhas" e "colunas" são do tipo int, ou seja, elas são variáveis que armazenam valores inteiros. No caso do código que você postou, elas são utilizadas para definir as dimensões da matriz a ser alocada dinamicamente. A memória alocada para a matriz é organizada de forma que os elementos fiquem "um do lado do outro" na memória, ou seja, os endereços dos elementos são vizinhos.

Espero ter esclarecido suas dúvidas! Se tiver mais alguma pergunta, é só me dizer. Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software