Šajā apmācībā mēs uzzināsim par tukšām norādēm un to izmantošanu, izmantojot piemērus.
Pirms turpināt šo apmācību, noteikti pārbaudiet C ++ rādītājus.
Programmā C ++ mēs nevaram piešķirt viena datu tipa mainīgā adresi cita datu tipa rādītājam. Apsveriet šo piemēru:
// 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;
Šeit kļūda radās tāpēc, ka adrese ir double
tipa mainīgais. Tomēr rādītājs ir int
veida.
Šādās situācijās mēs varam izmantot rādītāju, lai atceltu (tukšākas norādes) C ++. Piemēram,
// void pointer void *ptr; double d = 9.0; // valid code ptr = &d;
Neesošu rādītājs ir vispārīgs rādītājs, kas tiek izmantots, kad mēs nezinām datu tipu mainīgo ka rādītājs norāda uz.
1. piemērs: 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; )
Rezultāts
0xffd117ac 0xffd117ac
Šeit rādītājam ptr
tiek piešķirta vērtība &f
.
Izeja parāda, ka tukšais rādītājs ptr saglabā float
mainīgā f adresi .
Tāpat void
kā tukša veida, nevar norādīt uz tukšām norādēm.
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. piemērs: Void Pointer satura drukāšana
Lai izdrukātu tukša rādītāja saturu, mēs izmantojam static_cast
operatoru. Tas pārveido rādītāju no void*
veida uz atbilstošo adreses datu tipu, kuru rādītājs glabā:
#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; )
Rezultāts
Rādītāja saturs ir 2.3
Šī programma izdrukā adreses vērtību, uz kuru norāda void
rādītājs ptr.
Tā kā mēs nevaram novirzīt void
rādītāju, mēs nevaram to izmantot *ptr
.
Tomēr, ja pārveidojam void*
rādītāja tipu par float*
tipu, mēs varam izmantot vērtību, uz kuru norāda void
rādītājs.
Šajā piemērā mēs izmantojām static_cast
operatoru, lai pārveidotu rādītāja datu tipu no void*
uz float*
.
C stila liešana
Vērtības drukāšanai varam izmantot arī C stila liešanu.
// valid cout << *((float*)ptr);
Tomēr static_cast
priekšroka tiek dota C stila liešanai.
Piezīme: spēkā norādes nevar tikt izmantota, lai uzglabātu adreses mainīgo ar const
vai volatile
apzīmējumiem.
void *ptr; const double d = 9.0; // Error: invalid conversion from const void* to void* ptr = &d;