Ebben az oktatóanyagban megismerhetjük az érvénytelen mutatókat és azok használatát példák segítségével.
Mielőtt folytatná ezt az oktatóanyagot, ellenőrizze a C ++ mutatókat.
A C ++ nyelven nem rendelhetünk egy adattípusú változó címét egy másik adattípus mutatójához. Tekintsük ezt a példát:
// 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;
Itt a hiba azért következett be, mert a cím egy double
típusú változó. A mutató azonban int
típusú.
Ilyen helyzetekben a mutatót érvényteleníthetjük (érvénytelen mutatókat) a C ++ nyelven. Például,
// void pointer void *ptr; double d = 9.0; // valid code ptr = &d;
A void pointer egy általános mutató, amelyet akkor használnak, amikor nem ismerjük a változó adattípusát, amelyre a mutató mutat.
1. példa: 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; )
Kimenet
0xffd117ac 0xffd117ac
Itt a mutató ptr
megadja a &f
.
A kimenet azt mutatja, hogy a ptr érvénytelen mutató eltárolja az float
f változó címét .
Csakúgy, void
mint egy üres típus, az érvénytelen mutatókra sem lehet hivatkozni.
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
2. példa: Az Üres mutató tartalmának kinyomtatása
Az érvénytelen mutató tartalmának kinyomtatásához az static_cast
operátort használjuk . Átalakítja a mutatót a void*
típus által tárolt cím megfelelő adattípusára:
#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; )
Kimenet
A mutató tartalma 2.3
Ez a program kinyomtatja a cím értékét, void
amelyre a ptr mutató mutat.
Mivel nem vonhatunk le void
mutatót, nem használhatjuk *ptr
.
Ha azonban a void*
mutatótípust konvertáljuk float*
típusra, használhatjuk a void
mutató által mutatott értéket .
Ebben a példában az általunk használt a static_cast
kezelő átalakítani az adatok típusát a mutatót void*
, hogy float*
.
C stílusú casting
C-stílusú castingot is használhatunk az érték kinyomtatásához.
// valid cout << *((float*)ptr);
static_cast
Előnyben részesíti azonban a C stílusú castingot.
Megjegyzés: az érvénytelen mutatók nem használhatók változók const
vagy volatile
minősítők címének tárolására .
void *ptr; const double d = 9.0; // Error: invalid conversion from const void* to void* ptr = &d;