POINTER OPERATORLARI O'zgaruvchilarning (yani harqanday ob'ektning) adresini olishda biz &
operatorini - adres olish operatorini qo'llaymiz. Bu kontekstda & operatori
bir dona argument oladi. Undan tashqari & ikkili operatori bitli qo'shishda
qo'llaniladi. Adres olishga misol keltiraylik.
int *iPtr, var = 44;
iPtr = &var;
double d = 77.0, *dPtr = &d;
Bu yerda bir narsani o'tib ketishimiz kerak. C++ da identefikatorlar
(o'zgaruvchi va ob'ektlar) ikki turda bo'ladi. Birinchisi chap
identefikatorlar (lvalue - left value: chap qiymat), ikkinchi tur esa o'ng
identefikatorlardir (rvalue - right value: o'ng qiymat). Yani chap
identefikatorlar '=' (qiymat berish operatori) belgisining chap argumenti
sifatida qo'llanilishi mumkin. O'ng identifikatorlar esa '=' ning o'ngida
qo'yilishlari kerak. Bunda o'ng identefikatorlar har doim ham chap
identefikator o'rnida qo'llanila olomaydilar. Yani chap identefikatorlarning
qiymatlari '=' operatori yordamida o'zgartirilishi mumkin. Agar o'zgaruvchi
const sifati bilan e'lon qilingan bo'lsa, u normal sharoitda faqat o'ng
identefikatordir. Bu ma'lumotlarni keltirganimizning sababi, & adres olish
operatori faqat chap identefikator bo'la oladigan o'zgaruvchilarga nisbatan
qo'llanilishi mumkin. Agar o'zgaruvchi const sifatli konstantalarga, register
sifatli o'zgaruvchilarga va ko'rsatkich qaytarmaydigan (adres qaytarmaydigan)
ob'ektlarga nisbatan qo'llanilishi ta'qiqlanadi.
Faraz qilaylik, biz pointerimizga boshqa bir o'zgaruvchining adresini berdik.
Endi bizning pointerimiz ikki qiymatni ifoda etmoqda, biri bu o'zining
qiymati, yani boshqa o'zgaruvchining adresi, ikkinchi qiymat esa, bu boshqa
o'zgaruvchining asl qiymatidir. Agar biz pointerning o'zi bilan ishlasak,
biz hotiradagi adres bilan ishlagan bo'lamiz. Ko'p hollarda esa buning
keragi yo'q. Pointer ko'rsatayotgan o'zgaruvchining qiymati bilan ushbu
pointer yordamida ishlash uchun biz '*' belgisini, boshqacha qilib etganda,
ko'rsatish operatorini (indirection, dereferencing operator) qo'llashimiz
kerak bo'ladi. Bunga misol beraylik.
...
int k = 74;
int *kPtr = &k;
...
cout << k << " --- " << *kPtr << endl; // Ekranda:
// 74 --- 74
cin >> *kPtr; // 290 qiymatini kiritaylik...
cout << k << " === " << *kPtr << endl; // Ekranda:
// 290 === 290
*kPtr = 555;
cout << k << " ... "<< *Ptr << endl; // Ekranda:
// 555 ... 555
...
Ko'rib turganimizdek, biz kPtr ko'rsatkichi orqali k o'zgaruvchining ham
qiymatlarini o'zgartira oldik. Demak *kPtr chap identefikatordir, chunki
uning qiymatini qiymat berish operatori yordamida o'zgartira olar ekanmiz.
Agar pointerimiz 0 ga teng bo'lsa, uni ko'rsatish operatori - '*' bilan
ko'llash ko'p hollarda dastur ijrosi hatolariga olib keladi. Undan tashqari,
boshlangich qiymatlari aniqlanmagan pointerni qiymatiga ko'rsatish eng kamida
mantiqiy hatolarga olib keladi, bunung sababi, pointer ko'rsatayotgan hotira
qismida oldingi ishlagan dasturlar kodlari qolgan bo'lishi mumkin. Bu esa
bizga hech keragi yo'q. Pointer bo'lmagan o'zgaruvchilarga ko'rsatish
operatorini qo'llash ta'qiqlanadi.
Aslini olganda, & adres olish operatori va * ko'rsatish operatorlari,
bir-birining teskarisidir. Bir misol kertiraylik.
// Adres olish va ko'rsatish operatorlari