V tomto výukovém programu se pomocí příkladů dozvíme o ukazatelích neplatnosti a o tom, jak je používat.
Než budete pokračovat v tomto kurzu, nezapomeňte zkontrolovat ukazatele C ++.
V C ++ nemůžeme přiřadit adresu proměnné jednoho datového typu ukazateli na jiný datový typ. Zvažte tento pří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;
Zde došlo k chybě, protože adresa je double
typová proměnná. Ukazatel je však int
typu.
V takových situacích můžeme použít ukazatel na void (void pointers) v C ++. Například,
// void pointer void *ptr; double d = 9.0; // valid code ptr = &d;
Ukazatel void je obecný ukazatel, který se používá, když neznáme datový typ proměnné, na kterou ukazatel ukazuje.
Pří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ýstup
0xffd117ac 0xffd117ac
Zde je ukazatelu ptr
dána hodnota &f
.
Výstup ukazuje, že ukazatel void ptr ukládá adresu float
proměnné f.
Stejně void
jako prázdný typ nelze dereferencovat void ukazatele.
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
Příklad 2: Tisk obsahu prázdného ukazatele
K tisku obsahu ukazatele neplatnosti použijeme static_cast
operátor. Převádí ukazatel z void*
typu na příslušný datový typ adresy, kterou ukazatel ukládá:
#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ýstup
Obsah ukazatele je 2.3
Tento program vytiskne hodnotu adresy, na kterou ukazuje void
ukazatel ptr.
Protože nemůžeme dereference void
ukazatele, nemůžeme použít *ptr
.
Pokud však převedeme void*
typ ukazatele na float*
typ, můžeme použít hodnotu, na kterou ukazuje void
ukazatel.
V tomto příkladu jsme použili static_cast
operátor k převodu datového typu ukazatele z void*
na float*
.
Casting ve stylu C.
Můžeme také použít casting ve stylu C k tisku hodnoty.
// valid cout << *((float*)ptr);
Je však static_cast
upřednostňováno před castingem ve stylu C.
Poznámka: void pointers nelze použít k ukládání adres proměnných s const
nebo volatile
kvalifikátory.
void *ptr; const double d = 9.0; // Error: invalid conversion from const void* to void* ptr = &d;