Ponteiros genéricos

Nesta página, conheceremos os ponteiros genéricos, que apontam para endereços de memória de diferentes tipos de dados (tanto aqueles que já existem quanto aqueles que ainda criaremos).

✨ Criando ponteiros genéricos

Já estamos acostumados a lidar com a palavra void na linguagem de programção C em duas situações:

  • para indicar a ausência de parâmetros na funçãomain, como emint main(void);
  • para indicar um procedimento (função sem retorno), como emvoid imprimir(){...}.

Agora, veremos a aplicação do termo junto a ponteiros:

void *bPtr = &a;

Aplicando em um programa, teríamos a seguinte situação:

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

int main(void){
    int a = 10;
    void *bPtr = &a;
    return 0;
}

A declaração apresentada anteriormente indica que o ponteiro bPtr aponta para um endereço de memória cujo valor é de tipo desconhecido.

🪄 Acessando conteúdos de ponteiros genéricos

Como principal vantagem, o uso de ponteiros genéricos possibilita maior flexibilidade na declaração de ponteiros. Em contraponto, torna necessária a conversão de tipos (typecast) quando desejamos acessar o conteúdo apontado por um ponteiro.

printf("Valor: %d\n", *(int*)bPtr);

Confira o código abaixo:

#include<stdio.h>

int main(void){
    int vet[3] = {1,2,3};
    void *pont = &vet;
    
    /* Caso 1 */
    printf("Pont+0: %d", *(int*)(pont+0));
    
    /* Caso 2 */
    printf("Pont+1: %d", *(int*)(pont+1));
    
    /* Caso 3 */
    printf("Pont+4: %d", *(int*)(pont+4));


    return 0;
}

Qual será a saída do programa nos casos 1, 2 e 3?

🎬 Vídeos de apoio

📖 Bibliografia

Livros

  • Backes, A. (2018). Linguagem C - Completa e Descomplicada.