C ++ žymeklį anuliuoti (su pavyzdžiais)

Šioje pamokoje su pavyzdžių pagalba sužinosime apie negaliojančius patarimus ir kaip juos naudoti.

Prieš tęsdami šią mokymo programą, būtinai patikrinkite C ++ rodykles.

C ++ versijoje negalime priskirti vieno duomenų tipo kintamojo adreso kito duomenų tipo žymekliui. Apsvarstykite šį pavyzdį:

 // 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;

Čia įvyko klaida, nes adresas yra doubletipo kintamasis. Tačiau rodyklė yra inttipo.

Tokiose situacijose mes galime naudoti žymeklį panaikinti (negaliojančius rodiklius) C ++. Pavyzdžiui,

 // void pointer void *ptr; double d = 9.0; // valid code ptr = &d;

Negaliojančiu žymeklis yra bendrinis žymeklis, kuris yra naudojamas, kai mes nežinome duomenų tipą kintamojo kad žymiklis taškų į.

1 pavyzdys: C ++ tuščias žymeklis

 #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; )

Rezultatas

 0xffd117ac 0xffd117ac

Čia žymekliui ptrsuteikiama reikšmė &f.

Išvestis rodo, kad negaliojantis žymeklis ptr saugo floatkintamojo f adresą .

Kaip voidir tuščio tipo, tuščių nuorodų negalima daryti.

 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 pavyzdys: tuščio žymeklio turinio spausdinimas

Norėdami atsispausdinti tuščios žymeklio turinį, mes naudojame static_castoperatorių. Jis konvertuoja žymeklį iš void*tipo į atitinkamą adreso, kurį žymeklis saugo, duomenų tipą:

 #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; )

Rezultatas

 Rodyklės turinys yra 2.3

Ši programa išspausdina adreso, nurodyto voidrodyklės ptr, vertę .

Kadangi negalime daryti nuorodos į voidrodyklę, negalime naudoti *ptr.

Tačiau jei konvertuosime void*žymeklio tipą į float*tipą, galime naudoti voidrodyklės nurodytą vertę .

Šiame pavyzdyje mes naudojome static_castoperatorių, norėdami konvertuoti rodyklės duomenų tipą iš void*į float*.

C stiliaus liejimas

Taip pat vertybei atspausdinti galime naudoti C stiliaus liejimą.

 // valid cout << *((float*)ptr);

Tačiau static_castpirmenybė teikiama C stiliaus liejimui.

Pastaba: negaliojantys rodyklės negali būti naudojami kintamųjų adresams su žymikliais constarba volatilekvalifikatoriais laikyti .

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

Įdomios straipsniai...