Tässä opetusohjelmassa opit tyhjistä viitteistä ja niiden käytöstä esimerkkien avulla.
Ennen kuin jatkat tämän opetusohjelman kanssa, muista tarkistaa C ++ -osoittimet.
C ++: ssa emme voi määrittää yhden tietotyypin muuttujan osoitetta toisen tietotyypin osoittimelle. Harkitse tätä esimerkkiä:
// 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;
Tässä virhe tapahtui, koska osoite on double
tyyppimuuttuja. Osoitin on kuitenkin int
tyypiltään.
Tällaisissa tilanteissa voimme käyttää osoitinta mitätöimään (mitätöivät osoittimet) C ++: ssa. Esimerkiksi,
// void pointer void *ptr; double d = 9.0; // valid code ptr = &d;
Mitätön Osoitin on geneerinen osoitin, jota käytetään, kun emme tiedä tietotyyppi muuttujan että osoitin osoittaa.
Esimerkki 1: C ++ tarpeeton osoitin
#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; )
Tuotos
0xffd117ac 0xffd117ac
Tässä osoittimelle ptr
annetaan arvo &f
.
Lähtö osoittaa, että tyhjä osoitin ptr tallentaa float
muuttujan f osoitteen .
Kuten void
on tyhjä tyyppi, mitätön osoittimia ei voida dereferenced.
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
Esimerkki 2: Void Pointer -sisällön tulostaminen
Tyhjän osoittimen sisällön tulostamiseen käytämme static_cast
operaattoria. Se muuntaa osoitimen void*
tyypistä osoitteen vastaavaksi tietotyypiksi, jonka osoitin tallentaa:
#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; )
Tuotos
Osoittimen sisältö on 2.3
Tämä ohjelma tulostaa osoitteen void
ptr osoittaman osoitteen arvon .
Koska emme voi jättää osoittinta poikkeamatta void
, emme voi käyttää sitä *ptr
.
Jos kuitenkin muunnamme void*
osoittimen tyypin float*
tyypiksi, voimme käyttää void
osoittimen osoittamaa arvoa .
Tässä esimerkissä olemme käyttäneet static_cast
operaattori muuntaa tietotyyppi osoitinta void*
ja float*
.
C-tyylinen valu
Voimme käyttää myös C-tyylistä valua arvon tulostamiseen.
// valid cout << *((float*)ptr);
On kuitenkin static_cast
suositeltavampi kuin C-tyylinen valu.
Huomaa: tyhjiä osoittimia ei voida käyttää muuttujien osoitteiden const
tai määrittelijöiden tallentamiseen volatile
.
void *ptr; const double d = 9.0; // Error: invalid conversion from const void* to void* ptr = &d;