V tejto príručke sa dozvieme o neplatných ukazovateľoch a o tom, ako ich používať, pomocou príkladov.
Predtým, ako budete pokračovať v tomto výučbe, nezabudnite skontrolovať ukazovatele C ++.
V C ++ nemôžeme priradiť adresu premennej jedného údajového typu ukazovateľu iného údajového typu. Zvážte tento príklad:
// 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;
Tu sa vyskytla chyba, pretože adresa je double
typová premenná. Ukazovateľ je však int
typu.
V takýchto situáciách môžeme použiť ukazovateľ na neplatnosť (neplatné ukazovatele) v C ++. Napríklad,
// void pointer void *ptr; double d = 9.0; // valid code ptr = &d;
Ukazovateľ neplatnosti je všeobecný ukazovateľ, ktorý sa používa, keď nepoznáme dátový typ premennej, na ktorú ukazovateľ ukazuje.
Príklad 1: C ++ Void Pointer
#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; )
Výkon
0xffd117ac 0xffd117ac
Tu má ukazovateľ ptr
hodnotu &f
.
Výstup ukazuje, že ukazovateľ void ptr ukladá adresu float
premennej f.
Ako void
je prázdny typ void ukazovatele nemožno dereferencovat.
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
Príklad 2: Tlač obsahu neplatného ukazovateľa
Na tlač obsahu ukazovateľa neplatnosti používame static_cast
operátor. Konvertuje ukazovateľ z void*
typu na príslušný údajový typ adresy, ktorú ukazovateľ ukladá:
#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; )
Výkon
Obsah ukazovateľa je 2.3
Tento program vytlačí hodnotu adresy, na ktorú void
ukazuje ukazovateľ ptr.
Pretože nemôžeme odradiť void
ukazovateľ, nemôžeme ho použiť *ptr
.
Ak však prevedieme void*
typ ukazovateľa na float*
typ, môžeme použiť hodnotu, na ktorú void
ukazuje ukazovateľ.
V tomto príklade sme použili static_cast
operátor na prevod dátového typu ukazovateľa z void*
na float*
.
Casting v štýle C.
Na vytlačenie hodnoty môžeme použiť aj casting v štýle C.
// valid cout << *((float*)ptr);
Avšak static_cast
je výhodné odlievanie C-štýlu.
Poznámka: ukazovatele void nemožno použiť na ukladanie adries premenných s const
alebo volatile
kvalifikátormi.
void *ptr; const double d = 9.0; // Error: invalid conversion from const void* to void* ptr = &d;