C ++ Osoitin mitätöitäväksi (esimerkkien kanssa)

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 doubletyyppimuuttuja. Osoitin on kuitenkin inttyypiltää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 ptrannetaan arvo &f.

Lähtö osoittaa, että tyhjä osoitin ptr tallentaa floatmuuttujan f osoitteen .

Kuten voidon 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_castoperaattoria. 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 voidptr 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ää voidosoittimen osoittamaa arvoa .

Tässä esimerkissä olemme käyttäneet static_castoperaattori 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_castsuositeltavampi kuin C-tyylinen valu.

Huomaa: tyhjiä osoittimia ei voida käyttää muuttujien osoitteiden consttai määrittelijöiden tallentamiseen volatile.

 void *ptr; const double d = 9.0; // Error: invalid conversion from const void* to void* ptr = &d;

Mielenkiintoisia artikkeleita...