I denne vejledning lærer vi om ugyldige markører, og hvordan man bruger dem ved hjælp af eksempler.
Før du fortsætter med denne vejledning, skal du kontrollere C ++ - markører.
I C ++ kan vi ikke tildele adressen til en variabel af en datatype til en markør af en anden datatype. Overvej dette eksempel:
// pointer is of int type int *ptr; // variable is of double type double d = 9.0; // Error // can't assign double* to int* ptr = &d;
Her opstod fejlen, fordi adressen er en double
typevariabel. Markøren er dog af int
typen.
I sådanne situationer kan vi bruge markøren til at annullere (ugyldige markører) i C ++. For eksempel,
// void pointer void *ptr; double d = 9.0; // valid code ptr = &d;
Den ugyldige markør er en generisk markør, der bruges, når vi ikke kender datatypen for den variabel, som markøren peger på.
Eksempel 1: C ++ ugyldig markør
#include using namespace std; int main() ( void* ptr; float f = 2.3f; // assign float address to void ptr = &f; cout << &f << endl; cout << ptr << endl; return 0; )
Produktion
0xffd117ac 0xffd117ac
Her får markøren ptr
værdien af &f
.
Outputtet viser, at tomrumsmarkøren ptr gemmer adressen på en float
variabel f.
Som det void
er en tom type, kan ugyldige pekere ikke henvises til andet.
void* ptr; float* fptr; float f = 2.3; // assign float address to void pointer ptr = &f; cout << *ptr << endl; // Error // assign float address to float pointer fptr = &f; cout << *fptr << endl; // Valid
Eksempel 2: Udskrivning af indholdet af ugyldig markør
For at udskrive indholdet af en ugyldig markør bruger vi static_cast
operatøren. Den konverterer markøren fra void*
typen til den respektive datatype for den adresse, markøren lagrer:
#include using namespace std; int main() ( void* ptr; float f = 2.3f; // assign float address to void pointer ptr = &f; cout << "The content of pointer is "; // use type casting to print pointer content cout << *(static_cast(ptr)); return 0; )
Produktion
Markørens indhold er 2.3
Dette program udskriver værdien af den adresse, void
markøren ptr peger på.
Da vi ikke kan afvige en void
markør, kan vi ikke bruge *ptr
.
Men hvis vi konverterer void*
markørtypen til float*
typen, kan vi bruge den værdi, void
markøren peger på.
I dette eksempel har vi brugt static_cast
operatøren til at konvertere markørens datatype fra void*
til float*
.
C-stil støbning
Vi kan også bruge casting i C-stil til at udskrive værdien.
// valid cout << *((float*)ptr);
Det static_cast
foretrækkes imidlertid frem for støbning i C-stil.
Bemærk: ugyldige markører kan ikke bruges til at gemme adresser på variabler med const
eller volatile
kvalifikatorer.
void *ptr; const double d = 9.0; // Error: invalid conversion from const void* to void* ptr = &d;