U ovom uputstvu naučit ćemo o praznim pokazivačima i kako ih koristiti uz pomoć primjera.
Prije nego što nastavite s ovim uputstvom, provjerite C ++ pokazivače.
U C ++-u ne možemo dodijeliti adresu varijable jednog tipa podataka pokazivaču drugog tipa podataka. Razmotrite ovaj primjer:
// 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;
Ovdje se dogodila pogreška jer je adresa double
varijabla tipa. Međutim, pokazivač je int
tipa.
U takvim situacijama možemo koristiti pokazivač za void (void pointers) u C ++. Na primjer,
// void pointer void *ptr; double d = 9.0; // valid code ptr = &d;
Pokazivač void je generički pokazivač koji se koristi kada ne znamo tip podataka varijable na koju pokazivač pokazuje.
Primjer 1: Pokazatelj praznine C ++
#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; )
Izlaz
0xffd117ac 0xffd117ac
Ovdje je pokazivaču ptr
dana vrijednost &f
.
Izlaz pokazuje da pokazivač praznine ptr pohranjuje adresu float
varijable f.
Kao void
i prazan tip, pokazivači praznina ne mogu se dereferencirati.
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
Primjer 2: Ispis sadržaja pokazivača praznine
Za ispis sadržaja praznog pokazivača koristimo static_cast
operator. Pretvara pokazivač iz void*
tipa u odgovarajući tip podataka adrese koju pokazivač pohranjuje:
#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; )
Izlaz
Sadržaj pokazivača je 2.3
Ovaj program ispisuje vrijednost adrese na koju pokazuje void
pokazivač ptr.
Budući da ne možemo dereferencirati void
pokazivač, ne možemo ga koristiti *ptr
.
Međutim, ako pretvorimo void*
tip pokazivača u float*
tip, možemo koristiti vrijednost na koju pokazuje void
pokazivač.
U ovom smo primjeru koristili static_cast
operator za pretvorbu vrste podataka pokazivača iz void*
u float*
.
Lijevanje u stilu C
Za ispis vrijednosti možemo koristiti i lijevanje u stilu C.
// valid cout << *((float*)ptr);
Međutim, static_cast
preferira se lijevanje u stilu C.
Napomena: void pokazivači ne mogu se koristiti za pohranu adresa varijabli s const
ili volatile
kvalifikatora.
void *ptr; const double d = 9.0; // Error: invalid conversion from const void* to void* ptr = &d;