În acest tutorial, vom afla despre indicatoarele de gol și cum să le folosim cu ajutorul exemplelor.
Înainte de a continua cu acest tutorial, asigurați-vă că verificați indicatorii C ++.
În C ++, nu putem atribui adresa unei variabile de un tip de date unui pointer de alt tip de date. Luați în considerare acest exemplu:
// 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;
Aici, eroarea a apărut deoarece adresa este o double
variabilă de tip. Cu toate acestea, indicatorul este de int
tip.
În astfel de situații, putem folosi pointerul pentru a anula (pointeri void) în C ++. De exemplu,
// void pointer void *ptr; double d = 9.0; // valid code ptr = &d;
Void pointer este un indicator generic care este utilizat atunci când nu cunoaștem tipul de date al variabilei care indicatorul să.
Exemplul 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; )
Ieșire
0xffd117ac 0xffd117ac
Aici, indicatorului i ptr
se dă valoarea &f
.
Ieșirea arată că indicatorul gol ptr stochează adresa unei float
variabile f.
Așa cum void
este un tip gol, indicatorii de gol nu pot fi derecați.
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
Exemplul 2: Imprimarea conținutului indicatorului Void
Pentru a imprima conținutul unui pointer gol, folosim static_cast
operatorul. Convertește pointerul de la void*
tip la tipul de date respectiv al adresei pe care pointerul o stochează:
#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; )
Ieșire
Conținutul indicatorului este 2.3
Acest program imprimă valoarea adresei indicată de void
indicatorul ptr.
Deoarece nu putem dereca un void
pointer, nu putem folosi *ptr
.
Cu toate acestea, dacă convertim void*
tipul pointerului în float*
tip, putem folosi valoarea indicată de void
pointer.
În acest exemplu, am folosit static_cast
operatorul pentru a converti tipul de date al indicatorului de void*
la float*
.
Turnare în stil C
De asemenea, putem folosi turnarea în stil C pentru a imprima valoarea.
// valid cout << *((float*)ptr);
Cu toate acestea, static_cast
este preferat turnării în stil C.
Notă: pointerii void nu pot fi folosiți pentru a stoca adresele variabilelor cu const
sau volatile
calificative.
void *ptr; const double d = 9.0; // Error: invalid conversion from const void* to void* ptr = &d;