V tej vadnici bomo s pomočjo primerov spoznali prazne kazalce in kako jih uporabiti.
Preden nadaljujete s to vadnico, preverite kazalce C ++.
V C ++ naslovu spremenljivke enega podatkovnega tipa ne moremo dodeliti kazalca drugega podatkovnega tipa. Razmislite o tem primeru:
// 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 je prišlo do napake, ker je naslov double
spremenljivka tipa. Kazalec pa je int
tipa.
V takih situacijah lahko uporabimo kazalec za void (void kazalce) v C ++. Na primer
// void pointer void *ptr; double d = 9.0; // valid code ptr = &d;
Neveljaven kazalec generično kazalec, ki se uporablja, ko ne vemo, podatkovni tip spremenljivke, ki so kazalec točke na.
Primer 1: Kazalec za praznino 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; )
Izhod
0xffd117ac 0xffd117ac
Tu je kazalcu ptr
dana vrednost &f
.
Izhod kaže, da kazalec void ptr shrani naslov float
spremenljivke f.
Kakor void
je prazen tip, tudi praznih kazalcev ni mogoče razporejati.
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
Primer 2: Tiskanje vsebine kazalca za praznino
Za tiskanje vsebine praznega kazalca uporabimo static_cast
operator. Kazalec pretvori iz void*
vrste v ustrezen podatkovni tip naslova, ki ga shranjuje kazalec:
#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; )
Izhod
Vsebina kazalca je 2.3
Ta program natisne vrednost naslova, na katerega kaže void
kazalec ptr.
Ker ne moremo usmeriti void
kazalca, ne moremo uporabiti *ptr
.
Če pa void*
tip kazalca pretvorimo v float*
tip, lahko uporabimo vrednost, na katero kaže void
kazalec.
V tem primeru smo uporabili static_cast
operator za pretvorbo podatkovnega tipa kazalca iz void*
v float*
.
Ulivanje v slogu C
Za tiskanje vrednosti lahko uporabimo tudi ulivanje v slogu C.
// valid cout << *((float*)ptr);
Vendar static_cast
je prednost pred litjem v slogu C.
Opomba: void kazalci ni mogoče uporabiti za shranjevanje naslovov spremenljivk z const
ali volatile
kvalifikantov.
void *ptr; const double d = 9.0; // Error: invalid conversion from const void* to void* ptr = &d;