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ção
main
, como emint main(void)
; - para indicar um procedimento (função sem retorno), como em
void 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.