Até agora, meu entendimento sobre o ponteiro nulo é o seguinte.
Quando uma variável de ponteiro é declarada usando a palavra-chave void - ela se torna uma variável de ponteiro de uso geral. O endereço de qualquer variável de qualquer tipo de dados (char, int, float etc.) pode ser atribuído a uma variável de ponteiro nulo.
main()
{
int *p;
void *vp;
vp=p;
}
Como outro ponteiro de tipo de dados pode ser atribuído ao ponteiro nulo, usei-o na função absolut_value (código mostrado abaixo). Para fazer uma função geral.
Eu tentei escrever um código C simples que toma inteiro ou flutua como argumento e tenta torná-lo positivo, se negativo. Eu escrevi o seguinte código,
#include<stdio.h>
void absolute_value ( void *j) // works if used float, obviously it must work but thats not my interest here.
{
if ( *j < 0 )
*j = *j * (-1);
}
int main()
{
int i = 40;
float f = -40;
printf("print intiger i = %d \n",i);
printf("print float f = %f \n",f);
absolute_value(&i);
absolute_value(&f);
printf("print intiger i = %d \n",i);
printf("print float f = %f \n",f);
return 0;
}
Mas eu estava tendo erro, então cheguei a saber que meu entendimento com o ponteiro nulo não está correto :(. Então agora vou avançar para coletar pontos por que isso acontece.
As coisas que eu preciso entender mais sobre ponteiros nulos é isso.
Precisamos converter a variável void pointer para desreferenciá-la. Isso ocorre porque um ponteiro nulo não possui um tipo de dados associado a ele. Não há como o compilador saber (ou adivinhar?) Que tipo de dados é apontado pelo ponteiro nulo. Portanto, para pegar os dados apontados por um ponteiro nulo, nós o compilamos com o tipo correto de dados contidos no local dos ponteiros nulos.
void main()
{
int a=10;
float b=35.75;
void *ptr; // Declaring a void pointer
ptr=&a; // Assigning address of integer to void pointer.
printf("The value of integer variable is= %d",*( (int*) ptr) );// (int*)ptr - is used for type casting. Where as *((int*)ptr) dereferences the typecasted void pointer variable.
ptr=&b; // Assigning address of float to void pointer.
printf("The value of float variable is= %f",*( (float*) ptr) );
}
Um ponteiro nulo pode ser realmente útil se o programador não tiver certeza sobre o tipo de dado inserido pelo usuário final. Nesse caso, o programador pode usar um ponteiro nulo para apontar para o local do tipo de dados desconhecido. O programa pode ser configurado de forma a solicitar ao usuário que informe o tipo de dados e a conversão do tipo pode ser realizada de acordo com as informações inseridas pelo usuário. Um trecho de código é fornecido abaixo.
void funct(void *a, int z)
{
if(z==1)
printf("%d",*(int*)a); // If user inputs 1, then he means the data is an integer and type casting is done accordingly.
else if(z==2)
printf("%c",*(char*)a); // Typecasting for character pointer.
else if(z==3)
printf("%f",*(float*)a); // Typecasting for float pointer
}
Outro ponto importante que você deve ter em mente sobre os ponteiros nulos é que - a aritmética do ponteiro não pode ser executada em um ponteiro nulo.
void *ptr;
int a;
ptr=&a;
ptr++; // This statement is invalid and will result in an error because 'ptr' is a void pointer variable.
Então agora eu entendi qual foi o meu erro. Estou corrigindo o mesmo.
Referências :
http://www.antoarts.com/void-pointers-in-c/
http://www.circuitstoday.com/void-pointers-in-c .
O novo código é como mostrado abaixo.
#include<stdio.h>
#define INT 1
#define FLOAT 2
void absolute_value ( void *j, int *n)
{
if ( *n == INT) {
if ( *((int*)j) < 0 )
*((int*)j) = *((int*)j) * (-1);
}
if ( *n == FLOAT ) {
if ( *((float*)j) < 0 )
*((float*)j) = *((float*)j) * (-1);
}
}
int main()
{
int i = 0,n=0;
float f = 0;
printf("Press 1 to enter integer or 2 got float then enter the value to get absolute value\n");
scanf("%d",&n);
printf("\n");
if( n == 1) {
scanf("%d",&i);
printf("value entered before absolute function exec = %d \n",i);
absolute_value(&i,&n);
printf("value entered after absolute function exec = %d \n",i);
}
if( n == 2) {
scanf("%f",&f);
printf("value entered before absolute function exec = %f \n",f);
absolute_value(&f,&n);
printf("value entered after absolute function exec = %f \n",f);
}
else
printf("unknown entry try again\n");
return 0;
}
Obrigado,