cc77ffaa ffaa aa O‘zgaruvchilar bitta adresda joylashgan holda yaxlit qiymatning turli bo‘laklarini o‘zlashtiradi. Bunda, bir baytdan katta joy egal-lagan son qiymatining xotirada «teskari» joylashishi inobatga olinishi kerak.
Agar har xil turdagi ko‘rsatkichlarga qiymatlar berilsa, albat-ta turga keltirish amalidan foydalanish kerak:
int n=5;
float x=1.0;
int *pi=&n;
float *px=&x;
void *p;
int *r,*r1;
px=(float *)&n;
p=px;
r=(int *)p;
r1=pi;
Ko‘rsatkich turini void turiga keltirish amalda ma’noga ega emas. Xuddi shunday, turlari bir xil bo‘lgan ko‘rsatkichlar uchun turni keltirish amalini bajarishga hojat yo‘q.
Ko‘rsatkich ustidan bajariladigan arifmetik amallarda avto-matik ravishda turlarning o‘lchami hisobga olinadi.
Arifmetik amallar faqat bir xil turdagi ko‘rsatkichlar ustidan bajariladi va ular asosan, massiv tuzilmalariga ko‘rsatkich-lar ustida bajariladi.
Inkrement amali ko‘rsatkichni massivning keyingi elementiga, dekrement esa aksincha, bitta oldingi elementining adresiga ko‘chiradi. Bunda ko‘rsatkichning qiymati sizeof() qiymatiga o‘zgaradi. Agar ko‘rsatkich k o‘zgarmas qiymatga oshirilsa yoki kamaytirilsa, uning qiymati k*sizeof() kattalikka o‘zgaradi.
Masalan:
short int *p=new short[5];
long * q=new long [5];
p++; // p qiymati 2 oshadi
q++; // q qiymati 4 ga oshadi
q+=3; // q qiymati 3*4=12 oshadi
Ko‘rsatkichlarning ayirmasi deb, ular ayirmasining tur o‘lcha-miga bo‘linishiga aytiladi. Ko‘rsatkichlarni o‘zaro qo‘shish mumkin emas.
Adresni olish amali
Adresni olish quyidagicha e’lon qilinadi:
& ;
Bu erda - adresi olinadigan qiymatning turi, - adres oluvchi o‘zgaruvchi nomi. O‘rtadagi ‘&’ belgisiga adresni olish amali deyiladi.
Bu ko‘rinishda e’lon qilingan o‘zgaruvchi shu turdagi o‘zgaruvchining sinonimi deb qaraladi. Adresni olish amali orqali bitta o‘zgaruvchiga har xil nom bilan murojaat qilish mumkin bo‘ladi.
Misol:
int kol;
int & pal=kol; // pal murojaati, u kol
// o‘zgaruvchisining alьternativ nomi
const char & cr=’\n’; // cr - o‘zgarmasga murojaat
Adresni olish amalini ishlatishda quyidagi qoidalarga rioya qilish kerak: adres oluvchi o‘zgaruvchi funksiya parametri sifatida ishlatilgan yoki extern bilan tavsiflangan yoki sinf maydoniga murojaat qilingandan holatlardan tashqari barcha holatlarda boshlang‘ich qiymatga ega bo‘lishi kerak.
Adresni olish amali asosan funksiyalarda adres orqali uzatiluvchi parametrlar sifatida ishlatiladi.
Adres oluvchi o‘zgaruvchining ko‘rsatkichdan farqi shundaki, u alohida xotirani egallamaydi va faqat o‘z qiymati bo‘lgan o‘zgaruvchining boshqa nomi sifatida ishlatiladi.
Ko‘rsatkichlar va adres oluvchi o‘zgaruvchilar funksiya parametri sifatida Funksiya prototipida yoki aniqlanish sarlavhasida ko‘rsatilgan parametrlar formal parametrlar deyiladi, funksiya chaqirishida ko‘rsatilgan argumentlarga faktik parametrlar deyiladi.
Funksiya chaqirilishida faktik parametrning turi mos o‘rindagi formal parametr turiga to‘g‘ri kelmasa yoki shu turga keltirishning iloji bo‘lmasa kompilyasiya xatosi ro‘y beradi.
Faktik parametrlarni funksiyaga ikki xil usul bilan uzatish mumkin: qiymati yoki adresi bilan.
Funksiya chaqirilishida argument qiymat bilan uzatilganda, argument yoki uning o‘rnidagi kelgan ifoda qiymati va boshqa argu-mentlarning nusxasi (qiymatlari) stek xotirasiga yoziladi. Funksiya faqat shu nusxalar bilan amal qiladi, kerak bo‘lsa bu nusxalarga o‘zgartirishlar qilinishi mumkin, lekin bu o‘zgarishlar argument-ning o‘ziga ta’sir qilmaydi, chunki funksiya o‘z ishini tugatishi bilan nusxalar o‘chiriladi (stek tozalanadi).
Agar parametr adres bilan uzatilsa, stekka adres nusxasi yoziladi va xuddi shu adres bo‘yicha qiymatlar o‘qiladi (yoziladi). Funksiya o‘z ishini tugatgandan keyin shu adres bo‘yicha qilingan o‘zgarishlar saqlanib qolinadi va bu qiymatlarni boshqa funksiyalar ishlatishi mumkin.
Argument qiymat bilan uzatilishi uchun mos formal parametr sifatida o‘zgaruvchini turi va nomi yoziladi. Funksiya chaqirilishida mos argument sifatida o‘zgaruvchining nomi yoki ifoda bo‘lishi mumkin.
Faktik parametr adres bilan uzatilganda unga mos keluvchi formal parametrni ikki xil usul bilan yozish mumkin: ko‘rsatkich orqali yoki adresni oluvchi parametrlar orqali. Ko‘rsatkich orqali yozilganda formal parametr turidan keyin ‘*’ belgisi yoziladi, mos argumentda esa o‘zgaruvchining adresi (& amal orqali) yoki massiv nomi, yoki funksiya nomi bo‘lishi mumkin. Adresni olish amali orqali parametr uzatishda formal parametrda turidan keyin ‘&’ belgisi yoziladi va funksiya chaqirilishida mos argument sifatida o‘zgaruvchi nomi keladi.
Misol:
#include