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
# include
char c = 44; // char tipidagi o'zgaruvchi
char *pc = &c; // char tipidagi pointer
int main ()
{
cout << "&*pc ning qiymati: " << &*pc << endl;
cout << "*&pc ning qiymati: " << *&pc << endl;
cout << "c ning hotiradagi adresi: " << &c << endl;
cout << "pc pointerning qiymati: " << pc << endl;
cout << "c ning qiymati: " << c << endl;
cout << "*pc ning qiymati: " << *pc << endl;
return (0);
}
Ekranda:
&*pc ning qiymati: 0x4573da55
*&pc ning qiymati: 0x4573da55
c ning hotiradagi adresi: 0x4573da55
pc pointerning qiymati: 0x4573da55
c ning qiymati: 44
*pc ning qiymati: 44
Demak, &*pc va *&pc ayni ishni bajarar ekan, yani * va & operatorlari bir-birining teskarisidir. Hotiradagi adres ekranga boshqa ko'rinishda chiqishi mumkin. Bu mashina va kompilyatorga bog'liqdir.
Do'stlaringiz bilan baham: |