Bisher verstehe ich den leeren Zeiger wie folgt.
Wenn eine Zeigervariable mit dem Schlüsselwort void deklariert wird, wird sie zu einer universellen Zeigervariable. Die Adresse einer Variablen eines beliebigen Datentyps (char, int, float usw.) kann einer ungültigen Zeigervariable zugewiesen werden.
main()
{
int *p;
void *vp;
vp=p;
}
Da ein anderer Datentypzeiger dem ungültigen Zeiger zugewiesen werden kann, habe ich ihn in der Funktion absolut_value (Code unten gezeigt) verwendet. Um eine allgemeine Funktion zu machen.
Ich habe versucht, einen einfachen C-Code zu schreiben, der Integer oder Float als Argument verwendet und versucht, ihn + ve zu machen, wenn er negativ ist. Ich habe den folgenden Code geschrieben:
#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;
}
Aber ich habe einen Fehler bekommen, also habe ich erfahren, dass mein Verständnis mit dem leeren Zeiger nicht korrekt ist :(. Also werde ich jetzt darauf zugehen, Punkte zu sammeln, warum ist das so?
Die Dinge, die ich mehr über leere Zeiger verstehen muss, sind die folgenden.
Wir müssen die Void-Zeigervariable typisieren, um sie zu dereferenzieren. Dies liegt daran, dass einem ungültigen Zeiger kein Datentyp zugeordnet ist. Der Compiler kann auf keinen Fall wissen (oder raten?), Auf welche Art von Daten der Void-Zeiger zeigt. Um die Daten zu erfassen, auf die ein ungültiger Zeiger zeigt, geben wir sie mit dem richtigen Typ der Daten ein, die sich in der Position der ungültigen Zeiger befinden.
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) );
}
Ein ungültiger Zeiger kann sehr nützlich sein, wenn der Programmierer nicht sicher ist, welchen Datentyp die vom Endbenutzer eingegebenen Daten haben. In einem solchen Fall kann der Programmierer einen leeren Zeiger verwenden, um auf die Position des unbekannten Datentyps zu zeigen. Das Programm kann so eingestellt werden, dass der Benutzer aufgefordert wird, die Art der Daten zu informieren, und das Typ-Casting kann gemäß den vom Benutzer eingegebenen Informationen durchgeführt werden. Ein Code-Snippet ist unten angegeben.
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
}
Ein weiterer wichtiger Punkt, den Sie bei leeren Zeigern beachten sollten, ist, dass - Zeigerarithmetik nicht in einem leeren Zeiger ausgeführt werden kann.
void *ptr;
int a;
ptr=&a;
ptr++; // This statement is invalid and will result in an error because 'ptr' is a void pointer variable.
Jetzt verstand ich, was mein Fehler war. Ich korrigiere das gleiche.
Verweise :
http://www.antoarts.com/void-pointers-in-c/
http://www.circuitstoday.com/void-pointers-in-c .
Der neue Code ist wie unten gezeigt.
#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;
}
Danke dir,