C ++ İşaretçiyi geçersiz kılma (Örneklerle)

Bu eğitimde, boşluk işaretçileri ve bunları örnekler yardımıyla nasıl kullanacağımızı öğreneceğiz.

Bu eğiticiye devam etmeden önce, C ++ işaretçilerini kontrol ettiğinizden emin olun.

C ++ 'da, bir veri türündeki bir değişkenin adresini başka bir veri türünün işaretçisine atayamayız. Şu örneği düşünün:

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

Burada hata, adres bir doubletür değişkeni olduğu için ortaya çıktı . Ancak, işaretçi inttiptedir.

Bu gibi durumlarda, C ++ 'da void (void işaretçileri) için işaretçiyi kullanabiliriz . Örneğin,

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

Hükümsüz işaretçi o işaretçi işaret ettiği değişkenin veri türünü bilmiyorsanız zaman kullanılan bir jenerik göstericidir.

Örnek 1: 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; )

Çıktı

 0xffd117ac 0xffd117ac

Burada işaretçiye ptrdeğeri verilir &f.

Çıktı, ptr floatdeğişkeninin bir f değişkeninin adresini sakladığını gösterir .

Gibi voidboş bir türüdür geçersiz işaretçileri indirgenmedikleri edilemez.

 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

Örnek 2: Boş İşaretçinin İçeriğini Yazdırma

Bir boşluk göstericisinin içeriğini yazdırmak için static_castoperatörü kullanırız . İşaretçiyi void*türden işaretçinin depoladığı adresin ilgili veri türüne dönüştürür :

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

Çıktı

 İşaretçinin içeriği 2.3'tür

Bu program voidptr işaretçisinin gösterdiği adresin değerini yazdırır .

Bir voidgöstericiye referans veremeyeceğimiz için kullanamayız *ptr.

Ancak, void*işaretçi tipini tipe çevirirsek, işaretçinin float*gösterdiği değeri kullanabiliriz void.

Bu örnekte, kullanmış static_castgelen işaretçi veri türü dönüştürmek için operatör void*için float*.

C tarzı döküm

Değeri yazdırmak için C-stil dökümü de kullanabiliriz.

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

Ancak static_castC tarzı döküm tercih edilir.

Not: void işaretçileri, constveya volatileniteleyicilerle değişkenlerin adreslerini saklamak için kullanılamaz .

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

Ilginç makaleler...