English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial Básico de Linguagem C

Controle de Fluxo de Linguagem C

Função do C

Array do C

Ponteiro do C

String do C

Estruturas de Linguagem C

Arquivos de Linguagem C

Outros C

Manual de Referência do Linguagem C

Ponteiro void do C

Até agora,我们已经研究了分配给指针的地址应该与指针声明中指定的类型相同。 Por exemplo, se declaramos um ponteiro int, esse ponteiro int não pode apontar para uma variável float ou algum outro tipo de variável, ou seja, ele pode apontar apenas para variáveis do tipo int. Para superar esse problema, usamos ponteiros void. Ponteiros void representam ponteiros genéricos que podem apontar para qualquer tipo de dados. Podemos atribuir endereços de qualquer tipo de dados a um ponteiro void e atribuir um ponteiro void a qualquer tipo de ponteiro, sem executar nenhuma conversão explícita de tipo.

Sintaxe do ponteiro void

void *nome do ponteiro;

A seguir, fornece-se a declaração do ponteiro void:

void *ptr;

Nas declarações acima, void é o tipo do ponteiro e 'ptr' é o nome do ponteiro.

Vamos ver alguns exemplos:

int i=9;         //Inicialização de variável inteira
int *p;         // Declaração de ponteiro inteiro
float *fp;         // Declaração de ponteiro de ponto flutuante
void *ptr;         //Declaração de ponteiro void
p=fp;         // Errado.
fp=&i;         // Errado
ptr=p;         // Correto
ptr=fp;         // Correto
ptr=&i;         // Correto

Tamanho do ponteiro void em C

O tamanho do ponteiro void em C é o mesmo que o tamanho do ponteiro do tipo caractere. A representação do ponteiro void é a mesma que a do ponteiro do tipo caractere. O tamanho do ponteiro pode variar dependendo da plataforma usada.

Vamos ver o seguinte exemplo:

#include <stdio.h>
int main()
{
    void *ptr = NULL; //Ponteiro void
    int *p = NULL;// Ponteiro inteiro
    char *cp = NULL;//Ponteiro de caractere
    float *fp = NULL;//Ponteiro de ponto flutuante
    //O tamanho do ponteiro void
    printf("O tamanho do ponteiro void = %d\n\n",sizeof(ptr));
    //O tamanho do ponteiro inteiro
    printf("O tamanho do ponteiro inteiro = %d\n\n",sizeof(p));
    //O tamanho do ponteiro de caractere
    printf("O tamanho do ponteiro de caractere = %d\n\n",sizeof(cp));
    //O tamanho do ponteiro de ponto flutuante
    printf("O tamanho do ponteiro de ponto flutuante = %d\n\n",sizeof(fp));
    return 0;
}

Resultados de Saída

O tamanho do ponteiro void = 4
O tamanho do ponteiro inteiro = 4
O tamanho do ponteiro de caractere = 4
O tamanho do ponteiro de ponto flutuante = 4

Vantagens dos ponteiros void

Aqui estão as vantagens dos ponteiros void:

  • As funções malloc() e calloc() retornam ponteiros void, portanto essas funções podem ser usadas para alocar memória para qualquer tipo de dados.

#include <stdio.h>
#include<malloc.h>
int main()
{
   int a=90;
 
   int *x = (int*)malloc(sizeof(int));
   x=&a;
   printf("O valor apontado pelo ponteiro x: %d",*x);
    return 0;
}

Resultados de Saída

O valor apontado pelo ponteiro x: 90
  • Ponteiros void em C também podem ser usados para implementar funções genéricas em C.

Por que usamos ponteiros void?

Devido à sua reutilização, usamos ponteiros void. Ponteiros void podem armazenar qualquer tipo de objeto e podemos recuperar qualquer tipo de objeto usando operações indiretas com conversão de tipo apropriada.

Vamos entender isso através de um exemplo.

#include<stdio.h> 
int main() 
{ 
  int a=56; //Inicializar uma variável inteira 'a'.
  float b=4.5; //Inicialização de variável de ponto flutuante 'b'.
  char c='k'; //Inicialização de variável de caractere 'c'.
   void *ptr; //Declarar ponteiro nulo.
   // Alocar endereço para a variável "a".
   ptr=&a;
   printf("O valor de a é: %d",*((int*);ptr));
   //Alocar endereço para a variável 'b'.
   ptr=&b;
   printf("\nO valor de b é: %f",*((float*);ptr));
   //Alocar endereço para a variável 'c'.
   ptr=&c;
    printf("\n O valor de c é: %c",*((char*);ptr));
    return 0;
}

Resultados de Saída

O valor de a é: 56
O valor de b é: 4.500000
 O valor de c é: k