Post

Ponteiros, memória e alocação dinâmica

Ponteiros

São estruturas de dados que armazenam um endereço de memória. Em sua declaraçãom devem receber o tipo que será endereçado (int, float), assim como o prefixo *, indicando que se trata de um ponteiro.

1
2
3
4
5
6
7
8
9
int num = 5;
int *ponteiroNum;

// & passa o endereço de memória da variável
ponteiroNum = #

// As duas funções a seguir são equivalentes:
printf("%d",*ponteiroNum); // * acessa o conteúdo do endereço
printf("%d", num);

Passagem por referência

Ponteiros são muito úteis para alterar valores diretamente em uma variável dentro de uma função, sem que seja necessário retorná-la explicitamente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>

// Declaração explícita da função
void somaInt(int *soma, int a, int b);

void somaInt(int *soma, int a, int b){
    // Insere a soma de dois int por referência em outro int
    *soma = a+b;
}

int main(){
    int soma=0,a=5,b=3;
    
    // &soma é o endereço de memória da variável (ponteiro)
    somaInt(&soma,a,b);
    printf("%d",soma);

    return 0;
}

// -> É printado na tela '8'.

Alocação dinâmica

Para alocar dinamicamente vetores durante o tempo de execução, podem ser usadas as funções malloc e calloc. A diferença entre elas é que a função calloc irá zerar os valores alocados, enquanto malloc deixa o lixo de memória na alocação, mas sendo por sua vez mais rápida.

Para usar as funções malloc e calloc, deve-se lembrar de incluir a biblioteca stdlib.h!

Malloc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdlib.h>

int main(){
    int *p,i;
    p = malloc(100*sizeof(int));

    for (i=0;i<100;i++){
        p[i]=i;
    }

    free(p); // Libera memória alocada
    return 0;
}

Usar a função free é uma prática importante para liberar a memória alocada dinamicamente, que caso contrário, permanecerá alocada até que o computador seja reiniciado.

Calloc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdlib.h>

int main(){
    int *p,i;
    p = calloc(100, sizeof(int));

    for (i=0;i<100;i++){
        p[i]=i;
    }

    free(p); // Libera memória alocada
    return 0;
}

Nota-se que a sintaxe de malloc e calloc é um pouco diferente. Em um são especificados os bytes, e em outra os blocos de memória e o tamanho!

This post is licensed under CC BY 4.0 by the author.