logo

Ko’rsatgichlar va ular bilan bajariladigan asosiy amallar

Загружено в:

12.08.2023

Скачано:

0

Размер:

298.9833984375 KB
O’ZBEKISTON RESPUBLIKASI OLIY VA O’RTA
MAXSUS TA’LIM VAZIRLIGI SHAROF RASHIDOV
NOMIDAGI SAMARQAND  DAVLAT
UNIVERSITETI
KURS ISHI
Mavzu:  Ko’rsatgichlar va ular bilan
bajariladigan asosiy amallar.
                                
                                  Samarqand-2023  
Mundarija  
1  
  I.Kirish......................................................................3
II.Asosi qism.............................................................5
1. Ko’rsatkichlar haqida umumiy tushuncha……..9
2. Ko’rsatkichdan   foydalanish   va   uning
ta’rifi…..13
3. O’zgaruvchiga ko’rsatkich orqali kirish………15
4. Boshlangich ko’rsatkichlar……………………18
5. Massivlar   ko'rsatkichlar
o'rnida……………….22
6. Arifmetik ko'rsatkich………………………….24
7. Ko'rsatkichlar - massivning o'zgaruvchanligi…25
 
III.   Xulosa...............................................................26
IV.Foydalanilgan adabiyotlar..................................27
 
 
 
2  
   
I. Kirish. 
        Ko’rsatkich   yordamida,   joylashuvi   farqlanishi   mumkin.   Bu   hislat   ko’p   foydali
taminga ega. Ko’rsatkichlar yordamida programmani turli qismlarini har hil ma’nolar
almashuviga   qarab   ishlatishi   mumkin.   Undan   tashqari   10   -   bobda   ko’rishiz
mumkinki,   ko’rsatkichlar   programma   tuzishda   muhim   ahamiyatga   ega,   bular
obektlarni   bog’liq   turlarini   boshqaradi.   Bu   bobda   siz   ko’rsatkichdan   qanday
foydalanishni bilib olasiz.
    Programma   matnida   o‘zgaruvchi   e’lon   qilinganda,   kompilyator   o‘zgaruvchiga
xotiradan   joy   ajratadi.   Boshqacha   aytganda,   programma   kodi   xotiraga   yuklanganda
berilganlar   uchun,   ular   joylashadigan   segmentning   boshiga   nisbatan   siljishini,   ya’ni
nisbiy   adresini   aniqlaydi   va   ob’ekt   kod   hosil   qilishda   o‘zgaruvchi   uchragan   joyga
uning   adresini   joylashtiradi.Umuman   olganda,   programmadagi   o‘zgarmaslar,
o‘zgaruvchilar,   funksiyalar   va   sinf   ob’ektlar   adreslarini   xotiraning   alohida   joyida
saqlash   va   ular   ustidan   amallar   bajarish   mumkin.   Qiymatlari   adres   bo‘lgan
o‘zgaruvchilarga   ko   ‘rsatkich   o   ‘zgaruvchilar   deyiladi.   Ko‘rsatkich   uch   xil   turda
bo4ishi mumkin: - birorta ob’ektga, xususan o‘zgaruvchiga ko‘rsatkich; - funksiyaga
ko‘rsatkich;   -   void   ko‘rsatkich.   Ko‘rsatkichning   bu   xususiyatlari   uning   qabul   qilishi
mumkin   bo‘lgan   qiymatlarida   farqlanadi.   Ko‘rsatkich   albatta   birorta   turga
bogMangan   bo4ishi   kerak,   ya’ni   u   ko‘rsatgan   adresda   qandaydir   qiymatjoylanishi
mumkin   va   bu   qiymatning   xotirada   qanchajoy   egallashi   oldindan   ma’lum   boiishi
shart.   Funksiyaga   ko‘rsatkich.   Funksiyaga   ko‘rsatkich   programma   joylashgan
xotiradagi   funksiya   kodining   boshlang4ch   adresini   ko‘rsatadi,   ya’ni   funksiya
chaqirilganda   boshqaruv   ayni   shu   adresga   uzatiladi.   Ko‘rsatkich   orqali   funksiyani
oddiy   yoki   vositali   chaqirish   amalga   oshirish   mumkin.   Bunda   funksiya   uning   nomi
bo‘yicha   emas,   balki   funksiyaga   ko‘rsatuvchi   o‘zgaruvchi   orqali   chaqiriladi.
Funksiyani   boshqa   funksiyaga   argument   sifatida   uzatish   ham   funksiya   ko‘rsatkichi
orqali  bajariladi. Funksiyaga ko‘rsatkichning yozilish sintaksisi  quyidagicha:  (* ) ();
Bunda   -   funksiya   qaytaruvchi   qiymat   turi;   *   -   ko‘rsatkich   o‘zgaruvchining   nomi;   -
funksiya   parametrlarining   yoki   ulaming   turlarining   ro‘yxati.   Masalan:   int   (*fun)
(float,float); Bu erda butun son turida qiymat qaytaradigan fun nomidagi funksiyaga
ko‘rsatkich   e’lon   qilingan   va   u   ikkita   haqiqiy   turdagi   parametrlarga   ega.   Integral
hisoblash   funksiyasiga   ko‘rsatkich   orqali   integrali   hisoblanadigan   funksiya   adresi,   a
va   b   -   integral   chegaralari   qiymatlari   uzatiladi.   Oraliqni   bo‘lishlar   soni   -   n   global
o'zgarmas qilib e’lon qilinadi
3  
                                                                                 II.   Asosiy qism.
         1.Ko’rsatkichlar haqida umumiy tushuncha
Ko‘rsatkich   -   xotira   uyasining   unikal   adresini   saqlaydigan   o‘zgaruvchi.   Ko‘rsatkich
operativ   xotiradagi   biron-bir   o‘zgaruvchi   mavjud   bo‘lishi   mumkin   bo‘lgan   biron-bir
joyni   belgilaydi.   Ko‘rsatkichlarning   qiymatlarini   o‘zgartirish,   turli   variantlarda   qo‘llash
mumkinki,   bu   dasturning   moslashuvchanligini   oshiradi.Ko‘rsatkich   odatda   tipga   ega
bo‘lib quyidagicha e’lon qilinadi:
<turning nomi>*<ko‘rsatkichning nomi>=<dastlabki qiymat>
Misol uchun:
int *pr;
char *alfa;
Bu   holda   ko‘rsatkichlar   noaniq   qiymatga   ega   bo‘ladi.   Ko‘rsatkichlar   ta’riflanganda
ularning   tiplari   ko‘rsatilishi   shart.   Ko‘rsatkichlarni   initsializatsiya   kilish   ya’ni
boshlang‘ich qiymatlarini kiritish mumkin. Ma’lum turdagi biron-bir o‘zgaruvchi adresi
yoki   NULL   qiymat   dastlabki   qiymat   bo‘lishi   mumkin.   Ko‘rsatkichlarga   boshlang‘ich
maxsus NULL qiymati berilsa bunday ko‘rsatkich bo‘sh ko‘rsatkich deb ataladi.Biron-bir
o‘zgaruvchi   adresini   olish   hamda   uni   ko‘rsatkichga   qiymat   sifatida   berish   uchun   «&»
operatori qo‘llanadi.
Misol:
int I=100;
int*p=&I;
unsigned longint *ul=NULL;
Teskari   operator   -   «*»   bo‘lib,   ko‘rsatkichda   saqlanayotgan   adres   bo‘yicha   uya
qiymatiga murojaat qilish imkonini beradi.
Misol:
int I=100;
int*p=&I;
4  
  int J=*p;
Ilova   tushunchasi.   Ilova   (ssыlka)   –   ilova   ta’rifirda   ko‘rsatilgan   ob’ekt   nomining
sinonimi.
Ilovani e’lon qilish shakli
tur & ism =ism_ob’ekt;
Misollar
int x; // o‘zgaruvchining aniqlash
int& sx=x; //x o‘zgaruvchiga iqtibosni aniqlash
const char & CR='\n'; //konstantaga iqtibosni aniqlash
Ilovalar bilan ishlash qoidalari.
1)   O‘zgaruvchi   ilova,   agar   u   funksiya   parametri   bo‘lmasa,   extern   sifatida
tavsiflanmagan   bo‘lsa   yoki   sinf   maydoniga   ilova   qilmasa,   o‘ziga   tavsif   berilayotganda
ochiq-oydin nomlanishi kerak.
2) Nomlangandan so‘ng, ilovaga boshqa qiymat berilishi mumkin emas.
3) Ilovalarga ko‘rsatkichlar, ilovalar massivlari va ilovalarga ilovalar bo‘lishi mumkin
emas.
4)   Ilova   ustida   o‘tkazilgan   operatsiya   o‘zi   ilova   qilayotgan   qiymatning   o‘zgarishiga
olib keladi
Ko‘rsatkichlar   ustida   o‘tkaziladigan   operatsiyalar.   Ko‘rsatkichlar   ustida   unar
operatsiyalar   bajarish   mumkin:   inkrement   va   dekrement   ++   va   --   operatsiyalarini
bajarishda, ko‘rsatkich qiymati ko‘rsatkich murojaat qilgan tur uzunligiga ko‘payadi yoki
kamayadi.
Misol:
int*ptr, a[10];
ptr=&a[5];
ptr++;       */ = a[6]*/ elementining adresiga
ptr--;       */ = a[5]*/ elementining adresiga
5  
  Qo‘shish  va ayirish binar  operatsiyalarida ko‘rsatkich va int  turining qiymati  ishtirok
etishi   mumkin.   Bu   operatsiya   natijasida   ko‘rsatkich   qiymati   dastlabkisidan   ko‘rsatilgan
elementlar soniga ko‘proq yoki kamroq bo‘ladi.
Misol:
int*ptr1, *ptr2, a[10];
int i=2;
ptr1=a+(i+4);       /* = a[6]*/ elementining adresig
ptr2=ptr1-i;         /* = a[4]*/ elementining adresiga
Ayirish   operatsiyasida   bitta   turga   mansub   bo‘lgan   ikkita   ko‘rsatkich   ishtirok   etishi
mumkin.   Operatsiya   natijasi   int   turiga   ega   hamda   kamayuvchi   va   ayiruvchi   o‘rtasidagi
dastlabki  tur  elementlarining soniga teng, bundan tashqari  agar  birinchi  adres  kichikroq
bo‘lsa, u holda natija manfiy qiymatga ega bo‘ladi.
Misol:
int *ptr1, *ptr2, a[10];
int i;
ptr1=a+4;
ptr2=a+9
i=ptr1-ptr2; /*=5 */
i=ptr1-ptr2; /*=-5 */
Bir turga taalluqli bo‘lgan ikkita ko‘rsatkich qiymatlarini ==, !=, <, <=, >, >= amallari
yordamida   o‘zaro   qiyoslash   mumkin.   Bunda   ko‘rsatkichlarning   qiymatlari   shunchaki
butun sonlar sifatida olib qaraladi, qiyoslash natijasi esa 0 (yolg‘on) yoki 1 (rost) ga teng
bo‘ladi.
Misol:
int *ptr1, *ptr2, a[10];
ptr1=a+5;
ptr2=a+7;
6  
  if(ptr1>ptr2) a[3]=4;
Bu   misolda   ptr1   ning   qiymati   ptr2   ning   qiymatidan   kamroq,   shuning   uchun   a[3]=4
operatori   bajarilmay   qoladi.Konstanta   ko‘rsatkich   va   konstantaga   ko‘rsatkichlar.
Konstanta ko‘rsatkich quyidagicha ta’riflanadi:
<tip>* const<ko‘rsatkich nomi>=<konstanta ifoda>
Misol uchun: char* const key_byte=(char*)0x0417.
Bu   misolda   konstanta   ko‘rsatkich   klaviatura   xolatini   ko‘rsatuvchi   bayt   bilan
boglangandir.Konstanta   ko‘rsatkich   qiymatini   o‘zgartirish   mumkin   emas   lekin   *   amali
yordamida   xotiradagi   ma’lumot   qiymatini   o‘zgartirish   mumkin.   Misol   uchun
*key_byte=’YO’  amali  1047(0x0417)   adres   qiymati   bilan  birga  klaviatura  xolatini  ham
o‘zgartiradi.
Konstantaga ko‘rsatkich quyidagicha ta’riflanadi:
<tip>const*<ko‘rsatkich nomi>=<konstanta ifoda>.
Misol uchun const int zero=0; int const* p=&zero;
Bu   ko‘rsatkichga   *   amalini   qo‘llash   mumkin   emas,   lekin   ko‘rsatkichning   qiymatini
o‘zgartirish   mumkin.   Qiymati   o‘zgarmaydigan   konstantaga   ko‘rsatkichlar   quyidagicha
kiritiladi:
<tip>const* const<ko‘rsatkich nomi>=<konstanta ifoda>.
Misol uchun
const float pi=3.141593; float const* const pp=&pi;
Turlashtirilmagan ko‘rsatkich. Turlashtirilmagan (tipiklashtirilmagan) ko‘rsatkich void
turga   ega   bo‘lib,   ixtiyoriy   turdagi   o‘zgaruvchi   adresi   qiymat   sifatida   berilishi
mumkin.Maxsus   void   tipidagi   ko‘rsatkichlar   ajdodiy   ko‘rsatkichlar   deb   atalib   har   xil
tipdagi   ob’ektlar   bilan   bog‘lanish   uchun   ishlatiladi.Bu   xatolik  sababi   bitta   ob’ektga  har
xil   tipdagi   ko‘rsatkichlar   bilan   murojaat   kilish   mumkin   emas.Ko‘rsatkchlar   funksiya
parametri   sifatida.   Ko‘rsatkichlar   yordamida   parametr   qiymatini   o‘zgartirish
mumkin.Misol   uchun   turtburchak   yuzi   va   perimetrini   berilgan   tomonlari   bo‘yicha
hisoblash   funksiyasini   quyidagicha   tasvirlash   mumkin.Bu   funksiyaga   quyidagicha
murojaat kilinishi mumkin pr(a,b,&p,&s). Funksiyaga p va s o‘zgaruvchilarning adreslari
uzatiladi.   Funksiya   tanasida   shu   adreslar   bo‘yicha   2*(a+b)   va   a*b   qiymatlar
yoziladi.Ko‘rsatkichlar   o‘rniga   ilovalardan   foydalanish   dasturning   o‘qilishini
7  
  yaxshilaydi,   chunki   bu   o‘rinda   adres   bo‘yicha   qiymat   olish   operatsiyasini   qo‘llamasa
ham   bo‘ladi.   Qiymat   bo‘yicha   uzatish   o‘rniga   ilovalardan   foydalanish   samaraliroq
hamdir,   chunki   parametrlarni   nusxalashni   talab   qilmaydi.   Agar   funksiya   ichida
parametrning   o‘zgarishini   taqiqlash   lozim   bo‘lib   qolsa,   bu   holda   const   modifikatori
qo‘llanadi.   Bu modifikatorni funksiyada o‘zgarishi ko‘zda tutilmagan barcha parametrlar
oldidan   qo‘yish   tafsiya   qilinadi   (undagi   qaysi   parametrlar   o‘zgaradiyu,   qaysilari
o‘zgarmasligi   sarlavhadan   ko‘rinib   turadi).Ko‘rsatkich   va   massiv   nomi.   Massivlar   nomi
dasturda konstanta ko‘rsatkichdir. SHuning uchun ham int z[4] massiv elementiga *(z+4)
shaklda   murojaat   kilish   mumkin.Massivlar   bilan   ishlanganda   kavslarsiz   ishlash
mumkin.Massivlarni   funksiyalar   parametrlari   sifatida.  Massivlar  funksiyaga  turidagi   bir
o‘lchamli   massivlar   sifatida   yoki   ko‘rsatkichlar   sifatida   uzatilishi   mumkin.   Masalan
satrlar   funksiyaga   char   turidagi   bir   o‘lchamli   massivlar   sifatida   yoki   char*   turidagi
ko‘rsatkichlar sifatida uzatilishi  mumkin. Oddiy massivlardan farqli o‘laroq, funksiyada
satr uzunligi ko‘rsatilmaydi, chunki satr oxirida satr oxiri \0 belgisi bor.
Misol: Berilgan belgini satrda qidirish funksiyasi
int find(char *s,char c)
{
for (int i=0;i<strlen(s);i++)
if(s[i]==c) return i;
return –1
}
Massiv funksiya qiymati sifatida. Massiv qiymat qaytaruvchi funksiya ta’rifi:
float *sum_vec(int n,float a,float b)
{
float d[n];
for(int i=0;i<n;i++,d[i]=a[i]+b[i]);
return d;
}
Bu funksiyaga quyidagicha murojaat kilish mumkin:
8  
  float a[]={1,-1.5,-2},b[]={-5.2,1.3,-4};
float c[]=sum_vec(3,a,b);
      2.Ko’rsatkichdan foydalanish va uning ta’rifi
Oddiy ko’rsatkichni e’lon qilishni eslaylik:
int *a;
Bunda int tipidagi ma’lumotni o’zida saqlaydigan a ning manziliga yo’nalgan ko’rsatkich
e’lon   qilindi.   Doim   yodda   saqlash   zarurki,   ko’rsatkich   e’lon   qilingani   bilan,   hali   unga
biror xotira ajratilmadi. Agar shu holida ko’rsatkichdan foydalanmoqchi  bo’lsak, dastur
ishlamaydi. Chunki yerdan joy ajratib ekilmagan daraxtdan meva olish aqlga sig’maydi.
Buni huddi bozordan ekish uchun daraxt ko’chati olib kelib uni ekishga hali biror yerdan
joy ajratmaganingiz misol bo’ladi. Demak ko’chatimiz uchun chuqur kavlaymiz:
a = new int;
Dasturchilar   ko’p   unutadigan   narsa   e’lon   qilingan   ko’rsatkich   xotirasiga   boshlang’ish
qiymat   bermaslik.   Chunki   xotirada   ixtiyoriy   qiymat   turgan   bo’lishi   mumkin,   undan
foydalanganda   yoki   o’zgartirganda   kutilmagan   xatoliklar   kelib   chiqishi   mumkin.
Dereference orqali unga biror boshlang’ich qiymat beramiz: 
[code]*a = 11;[/code]
Xotiradan joy ajratildi. Ko’rsatkichimiz aniq bir xotira manzilini ko’rsatib turibdi. Daraxt
ekilgan  joydagi   daraxtni   olib   tashlab   o’rniga  boshqa   daraxt   ekish   mumkin  bo’lganidek,
xotiradagi   manzilni   bilib   undagi   qiymatni   istalgancha   o’zgartirishimiz   mumkin.(*a=5,
*a=-10,…) Ko’satkich haqida o’ylaganingizda u mavhumdek tuyulishi mumkin, lekin siz
undan   haqiyqisini   qalbakilaridan   farqlashda   foydalanishingiz   mumkin   Har   bir
o’zgaruvchi   kompyuter   xotirasining   ma’lum   bir   joyida   joylashgan   bo’ladi.   har   bir
o’zgaruvchi   qayerda   saqlanayotgani   haqida   bilmaysiz,   qayerda   nima   bo’lyatganini
kuzatib   turishingiz   mumkin.   Bilamizki   harrys_pointer   20300da   joylashgan.
Hisoblagichning   qiymat   ko’satgichi   ham   20300da.   Diagrammalarda,   ko’rsatkich
boshlangan   joydan   boshlab   chizib   boramiz,   lekin   kompyuterda   chizishni   o’rniga,
sonlardan   foydalanamiz.   Ko’rsatkichdan   foydalanishda   ,   siz   istalgan   vaqtda   boshqa
hisobga o’ta olasiz.   Ko‘p o‘lchamli massivlar va ko‘rsatkichlar. C++ da massivning eng
9  
  umumiy   tushunchasi   -   bu   ko‘rsatkichdir,   bunda   har   xil   turdagi   ko‘rstakich   bo‘lishi
mumkin,   ya’ni   massiv   har   qanday   turdagi   elementlarga,   shu   jumladan,   massiv   bo‘lishi
mumkin   bo‘lgan   ko‘rsatkichlarga   ham   ega   bo‘lishi   mumkin.   O‘z   tarkibida   boshqa
massivlarga   ham   ega   bo‘lgan   massiv   ko‘p   o‘lchamli   hisoblanadi.Bunday   massivlarni
e’lon   qilishda   kompyuter   xotirasida   bir   nechta   turli   xildagi   ob’ekt
yaratiladi.Ko‘rsatkichlar massivlari. Ko‘rsatkichlar massivlari quyidagicha ta’riflanadi.
                                            <tip> *<nom>[<son>]
Misol   uchun   int   *pt[6]   ta’rif   int   tipidagi   ob’ektlarga   olti   elementli   massivni
kiritadi.Ko‘rsatkichlar   massivlari   satrlar   masssivlarini   tasvirlash   uchun   qulaydir.Misol
uchun familiyalar ro‘yxatini kiritish uchun ikki o‘lchovli massivdan foydalani kerak.
char fam[][20]={   "Danayev","Raximov","Ergashev"}
Xotirada   60   elementdan   iborat   bo‘ladi,   chunki   har   bir   familiya   20   gacha   0   lar   bilan
to‘ldiriladi.Ko‘rsatkichlar   massivi   yordamida   bu   massivni   quyidagicha   ta’riflash
mumkin.
char *pf[]= {   "Danayev","Raximov","Ergashev"}.
Bu holda ro‘yxat xotirada 23 elementdan iborat bo‘ladi, chunki har bir familiya oxiriga
0 belgisi kuyiladiHar xil chegarali jadvallar bilan funksiyalardan foydalanishning bir yuli
bu oldindan kiritiluvchi konstantalardan foydalanishdir. Lekin asosiy yuli ko‘rsatkichlar
massivlaridan   foydalanish.Bir   o‘lchovli   dinamik  massivlar.   C++tilida   o‘zgaruvchilar   yo
statik   tarzda   -   kompilyasiya   paytida,   yoki   standart   kutubxonadan   funksiyalarni   chaqirib
olish   yo‘li   bilan   dinamik   tarzda   -   dasturni   bajarish   paytida   joylashtirilishi   mumkin.
Asosiy   farq   ushbu   usullarni   qo‘llashda   ko‘rinadi   -   ularning   samaradorligi   va
moslashuvchanligida.   Statik   joylashtirish   samaraliroq,   chunki   bunda   xotirani   ajratish
dastur   bajarilishidan   oldin   sodir   bo‘ladi.   Biroq   bu   usulning   moslashuvchanligi   ancha
past,   chunki   bunda   biz   joylashtirilayotgan   ob’ektning   turi   va   o‘lchamlarini   avvaldan
bilishimiz   kerak   bo‘ladi.   Masalan,   matniy   faylning   ichidagisini   satrlarning   statik
massivida   joylashtirish   qiyin:   avvaldan   uning   o‘lchamlarini   bilish   kerak   bo‘ladi.
Noma’lum sonli elementlarni oldindan saqlash va ishlov berish kerak bo‘lgan masalalar
odatda xotiraning dinamik ajratilishini talab qiladi.
Xotirani dinamik va statik ajratish o‘rtasidagi asosiy farqlar quyidagicha:
statik   ob’ektlar   nomlangan   o‘zgaruvchilar   bilan   belgilanadi,   hamda   ushbu
ob’ektlar   o‘rtasidagi   amallar   to‘g‘ridan-to‘g‘ri,   ularning   nomlaridan   foydalangan
holda, amalga oshiriladi. Dinamik ob’ektlar o‘z shaxsiy otlariga ega bo‘lmaydi, va
ular ustidagi amallar bilvosita, ko‘rsatkichlar yordamida, amalga oshiriladi;
10  
  statik   ob’ektlar   uchun   xotirani   ajratish   va   bo‘shatish   kompilyator   tomonidan
avtomatik   tarzda   amalga   oshiriladi.   Dasturchi   bu   haqda   o‘zi   qayg‘urishi   kerak
emas.   Statik   ob’ektlar   uchun   xotirani   ajratish   va   bo‘shatish   to‘laligicha   dasturchi
zimmasiga   yuklatiladi.   Bu   anchayin   qiyin   masala   va   uni   echishda   xatoga   yo‘l
qo‘yish oson.
Dinamik   tarzda   ajratilayotgan   xotira   ustida   turli   xatti-harakatlarni   amalga
oshirish   uchun   new   va   delete   operatorlari   xizmat   qiladi.Ma’lum   bir   turdagi
elementlardan   tashkil   topgan   berilgan   o‘lchamlardagi   massivga   xotira   ajratish
uchun new operatoridan foydalanish lozim:
int *pia=new int[4];
Bu   misolda   xotira   int   turidagi   to‘rtta   elementdan   iborat   massivga   xotira   ajratiladi.
Afsuski,   new   operatorining   bu   shakli   massiv   elementlarini   nomlantirish
(initsiallashtirish) imkonini bermaydi.
Dinamik massivni bo‘shatish uchun delete operatoridan foydalanish lozim:
delete[] pia;
Agar   ajratilgan   xotirani   bo‘shatish   esdan   chiqqudek   bo‘lsa,   bu   xotira   bekordan-
bekorga   sarflana   boshlaydi,   foydalanilmay   qoladi,   biroq,   agar   uning   ko‘rsatkichi   o‘z
qiymatini o‘zgartirgan bo‘lsa, uni tizimga qaytarish mumkin emas. Bu hodisa xotiraning
yo‘qotilishi (utechka pamyati) degan maxsus nom bilan ataladi. Pirovard natijada dastur
xotira   etishmagani   tufayli   avariya   holatida   tugallanadi   (agar   u   ancha   vaqt
ishlayversa).Ikki   o‘lchovli   dinamik   massivlar.   Matritsani   shakllantirishda   oldin   bir
o‘lchovli   massivlarga   ko‘rsatuvchi   ko‘rsatkichlar   massivi   uchun   xotira   ajratiladi,   keyin
esa parametrlissiklda bir o‘lchovli massivlarga xotira ajratiladi.
Misol:
int n;
cin>>n;
double *matr[100];
for (i=0;i<n;i++) matr[i]=new int[n];
Xotirani   bo‘shatish   uchun   bir   o‘lchovli   massivlarni   bo‘shattiruvchi   siklni   bajarish
zarur.
for(int i=0;i<n;i++)
11  
  delete matr[i];
Funksiyalarni   chaqirishda   foydalanish.   C++   tili   sintaksisiga   ko‘ra   funksiyaga
ko‘rsatkich   funksiya   adresini   aks   ettiruvchi   o‘zgaruvchi   yoki   ifodadir.   Funksiyaga
ko‘rsatkich   bajariluvchi   qiymati   funksiya   kodining   birinchi   bayti   adresidir.   Funksiyaga
ko‘rsatkichlar   ustida   arifmetik   amallar   bajarish   mumkin   emas.   Eng   keng   qo‘llanuvchi
funksiyaga   konstanta   ko‘rsatkich   funksiyaning   nomidir.   Funksiyaga   o‘zgaruvchi
ko‘rsatkich   funksiya   ta’rifi   va   prototipidan   aloxida   kiritiladi.   Funksiyaga   o‘zgaruvchi
ko‘rsatkich quyidagicha tasvirlanadi:
  <funksiya tipi> (* ko‘rsatkich nomi)(parametrlar spetsifikatsiyasi).
Misol uchun int (*point) (void).
Bu   ta’rifda   qavslar   muxim   ahamiyatga   ega,   chunki   qavslar   yozilmasa   bu   ta’rif
parametrsiz   funksiya   prototipi   deb   karaladi.   Funksiyaga   o‘zgaruvchi   ko‘rsatkich
qiymatlari   sifatida,   bir   xil   tipga   ega   bo‘lgan   har   xil   funksiyalar   adreslarini   berilishi
mumkin.Qiymati   biror   funksiya   adresiga   teng   bo‘lgan   funksiyaga   o‘zgaruvchi
ko‘rsatkich   shu   funksiyaga   murojaat   kilish   uchun   ishlatilishi   mumkin.Dasturda
funksiyaga   kostanta   ko‘rsatkich   ya’ni   nomlari   orqali   va   o‘zgaruvchi   ko‘rsatkichlar
yordamida murojaat qilishning hamma usullari ko‘rsatilgandir. SHuni ta’kidlash lozimki
adres   olish   *   amali   qo‘llanilganda   qavslar   ishlatish   shartdir.Funksiyaga   o‘zgaruvchi
ko‘rsatkich   ta’riflanganda   insializatsiya   qilish,   ya’ni   boshlang‘ich   qiymat   sifatida
o‘zgaruvchi   ko‘rsatkich   bilan   bir   xil   tipga   ega   bo‘lgan   funksiya   adresini   ko‘rsatish
mumkin. Misol uchun:
int fic (char);
int (*pfic) (char)=fic;
Funksiyalarga ilovalar. Funkiyaga ko‘rsatkich qanday aniqlansa funksiyaga ilova ham
xuddi shunday aniqlanadi:
funksiya_turi(&ilova_nomi)(parametrlar)nomlantiruvchi_ifoda;
Misol:
int(&fret)(float,int)=f;// ilovani aniqlash
Funksiya   nomini   parametrlarsiz   va   qavslarsiz   qo‘llash   funksiya   adresi   sifatida   qabul
qilinadi.   Funksiyaga   ilova   funksiya   nomining   sinonimi   bo‘ladi.   Funksiyaga   ilovaning
qiymatini   o‘zgartirib   bo‘lmaydi,   shuning   uchun   ko‘p   o‘rinda   funksiyaga   ilovalar   emas,
funksiyaga   ko‘rsatkichlar   qo‘llanadi.Funksiyaga   ko‘rsatkichlar   parametr
12  
  sifatida.   Funksiyaga   ko‘rsatkichlarlarni   funksiyalarga   parametr   sifatida   uzatish
mumkin. Ko‘rsatkichlar ko‘pincha dinamik xotira (boshqacha nomi «uyum» yoki «heap»)
bilan bogMiq holda ishlatiladi. Xotiraning dinamik deyilishiga sabab, bu sohadagi bo‘sh
xotira   programma   ishlashjarayonida,   kerakli   paytida   ajratib   olinadi   va   zarurat
qolmaganida qaytariladi (bo‘shatiladi). Dinamik xotiraga faqat ko‘rsatkichlar yordamida
murojaat   qilish   mumkin.   Bunday   o‘zgaruvchilar   dinamik   o   ‘zgaruvchilar   deyiladi   va
ulami   yashash   vaqti   yaratilgan   nuqtadan   boshlab   programma   oxirigacha   yoki   oshkor
ravishda yo‘qotilgan (bogMangan xotira bo‘shatilgan)joygacha boMadi. Ko‘rsatkichlarni
e’lon   qiIishda   unga   boshlang4ch   qiymatlar   berish   mumkin.   Boshlang4ch   qiymat
(initsializator)   ko‘rsatkich   nomidan   so‘ng   yoki   qavs   ichida   yoki   *=’   belgidan   keyin
beriladi.   Boshlang4ch   qiymatlar   quyidagi   usullar   bilan   berilishi   mumkin:   I.
Ko‘rsatkichga  mavjud  boMgan  ob’ektning adresini   berish:  a)   adresni   olish  amal  orqali:
int   i=5,k=4;   //   butun   o'zgaruvchilar   int   *p=&i;   //   p   ko'rsatkichga   i   o'zgaruvchining   //
adresi yoziladi int *pl(&k); // pl ko'rsatkichga k o'zgaruvchining // adresi yoziladi
      3.O’zgaruvchiga ko’rsatkich orqali kirish.
O’zgaruvchiga   kirish   huquqini   ko’rsatadi   qachonki   u   bor   bo’lsa.   Operatorlar
o’zgaruvchining   ko’rsatkichlarini   o’qishda   yoki   yangilashda   foydalanadi.
Operatorlarning   hyech   qanday   amallar   bilan   aloqasi   yo’qligida,   ko’rsatkichlardan
birgalikda foydalanadilar. Standart C++, bu operator Indirection Operator deb nomlanadi
lekin umumiy qilib dereferencing operator deb ham nomlasa bo’ladi. W account pointer
qaysi hisob raqamni ko’rsatsa ariza shunga beriladi. *account_pointer = 1000; Boshqacha
qilib aytganda  * account_pointerdan  foydalanish  yo’li   harry_account  yoki  jory_account
yo’li bilan judayam o’xshash. Bunday hisobda ko’rsatuvchi topshiriqning chap yoki o’ng
tomonda   bo’lishini   ifodalaydi.   U   chap   tomonda   sodir   bo’lsa,   o’ng   tomondagi   qiymati
joyida   saqlanadi.   Qachonki   u   o’ng   tomonda   paydo   bo’lsa,   qiymati   joyidan   olinadi   va
chapdagi   o’zgaruvchilarga   qo’yiladi.   Misol   uchun,   quyidagi   bayonot   o’zgaruvchilarni
o’qiydi   va   account_pointer   hisoblaydi,   o’zgaruvchilarnig   o’z   mazmunini   joylashtiradi.
balance   =   account_pointer;   Sizda   har   ikala   tarafda   ham   account_pointeri   bo’lishi
mumkin.   Quyidagi   xabar   $100   aniqlaydi   *account_pointer   =   *account_pointer   –   100.
Funksiya   prototipida   yoki   aniqlanish   sarlavhasida   ko‘rsatilgan   parametrlar   formal
parametrlar deyiladi, funksiya chaqirishida ko‘rsatilgan argumentlarga faktikparametrlar
deyiladi. Funksiya chaqirilishida faktik parametming turi mos o‘rindagi formal parametr
turiga   to‘g‘ri   kelmasa   yoki   shu   turga   keltirishning   iloji   boMmasa   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‘midagi   kelgan   ifoda   qiymati   va   boshqa   argumentlaming   nusxasi
(qiymatlari) stek xotirasiga yoziladi. Funksiya faqat shu nusxalar bilan amal qiladi, kerak
13  
  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   qiymatlami
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   boMishi   mumkin.   Faktik   parametr
adres   bilan  uzatilganda   unga   mos   keluvchi   formal   parametmi   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  boMishi
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 void f(int,int*,int &) void main() { int i=l,j=2,k=3; cout<<i<<" "
<   <   j   «   "   "<<<i<<"   "   <   <   j   «   "   ''<++;   к ++   ;   *j=i+k;   k=*j+i;   }   Programma   ishlashi
natijasida   ekranga   quyidagi   qiymatlar   chop   qilinadi:   l   2   3   l   6   8   Bu   misolda   birinchi
parametr i qiymat bilan uzatiladi (“int i"). Uning qiymati funksiya ichida o‘zgaradi, lekin
tashqaridagi   i   o‘zgaruvchisining   qiymati   o‘zgarmaydi.   Ikkinchi   parametmi   ko‘rsatkich
orqali adresi bilan uzatilishi  talab qilinadi (“int *j”), adresni  uzatish uchun ‘&’- adresni
olish amali ishlatilgan (“&j”)- Funksiya tanasida argument adresidan qiymat olish uchun
‘*’-   qiymat   olish   amali   qoMlanilgan.   Uchinchi   parametrda   murojaat   orqali   (“&k”)
argumentning   adresi   uzatish   ko‘zda   tutilgan.   Bu   holda   funksiya   chaqirilishida   mos
argument   o‘mida   o‘zgaruvchi   nomi   turadi,   funksiya   ichida   esa   qiymat   olish   amalini
ishlatishning   hojati  yo‘q.  Funksiya  ishlash  natijasidagi  qiymatlami   argumentlar  ro‘yxati
orqali   olish   qulay   va   tushunarli   usul   hisoblanadi.   Agar   funksiya   ichida   adres   bilan
uzatiladigan   parametr   qiymati   o‘zgarmasdan   qolishi   zarur   bo‘lsa,   bu   parametr   const
modifikator   bilan   yozilishi   kerak:   fun(int   n,const   char*str);   Agarda   funksiyani
chaqirishda argumentlar faqat nomlari bilan berilgan bo‘lsa, kelishuv bo‘yicha massivlar
va   funksiyalar   adresi   bilan,   qolgan   turdagi   parametrlar   qiymatlari   bilan   uzatilgan   deb
hisoblanadi.   Misol   tariqasida   diskriminantni   hisoblash   usuli   yordamida   ax2+bx+c=0
ko‘rinishidagi   kvadrat   tenglama   ildizlarini   funksiya   parametrlari   vositasida   olish
masalasini   ko‘raylik.   #include   #include   int   Kvadrat_Ildiz(float   a,float   b,float   c,   float   &
xl, float & x2) { float D ; D=b*b-4*a*c; if(D<<"ax^2+bx+c=0 tenglama ildizini topish.
"; cout<<"\n a - koeffisiyentni kiriting: "; cin>>a; cout<<"\n b - koeffisiyentni kiriting: ";
cin>>b;   cout<<"\n   c   -   koeffisiyentni   kiriting:   ";   cin>>c;   switch
(Kvadrat_Ildiz(a,b,c,xl,x2))   (   case   0:   cout<<"Tenglama   haqiqiy   ildizga   ega   emas!";
break;   case   1:   cout   <<''Tenglama   yagona   ildizga   ega:   ";   cout<<"\n   x=   "   «   x   l   ;   break;
14  
  default:cout«"Tenglama   ikkita  ildizga   ega:   "  ;   c   out«"\nxl=   "   «  x   l   ;   cout«"\nx2=   "   «  x
2   ;   }   return   0;   }   Programmadagi   Kvadrat_Ildiz()   funksiyasi   kvadrat   tenglama   ildizini
hisoblaydi.   Uning   qaytaradigan   qiymati   tenglamaning   nechta   ildizi   borligini   anglatadi.
Agar   tenglamaning   haqiqiy   ildizi   mavjud   bo4masa   (D0   bo‘lsa   funksiya   2   qiymatini
qaytaradi.   Mavjud   ildizlar   -   xl   va   x2   adres   oluvchi   parametrlarda   qaytariladi.   Adresni
olish quyidagicha e’lon qilinadi: & ; Bu erda - adresi olinadigan qiymatning turi, - adres
oluvchi   o‘zgaruvchi   nomi.   0   ‘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 k o l ; int & pal=kol; // pal adres oluvchi o'zgaruvchi kol //
o'zgaruvchisining   alternativ   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
boshlangMch   qiymatga   ega   bo4ishi   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
bo4gan o‘zgaruvchining boshqa nomi sifatida ishlatiladi.
                      4. . Boshlangich ko’rsatkichlar  
        Ko’rsatkichlar   yordami   bilan,   to’g’ri   o’rnata   olishga   e’tibor   berish   juda   muhim
sanaladi.  Boshlang’ich ko’rsatkichlarda,  Ko’rsatkich  va xotira  manzili  bir  xil  bo’lishiga
e’tibor bering int balance = 1000; double* account_pointer = &balance; // Error! Manzil
va   balans   ko’rsatkichli   qiymatga   ega   bo’ladi.   Bu   hech   qachon   int   bilan   bir   juft
ko’rsatkich   huquqiy   emasligini   ko’rsatadi.   Agar   siz   bir   ko’rsatkich   o’zgaruvchisini
qo’shimcha   o’zgaruvchiga   yetkazib   bermasdan   aniqlasangiz,   ko’rsatkich   tasodifiy
manzilni o’z ichiga oladi. Bu tasodifiy manzildan foydalanish xato hisoblanadi. Amalda,
dasturingiz   sirli   ishlashga   o’tadi   yoki   to’qnashadi   agar   boshlang’ichsiz   foydalansangiz.
double*   account_pointer;   //   Forgot   to   initialize   *account_pointer   =   1000;   //   NO!
account_pointer   contains   an   unpredictable   value   Siz   ko’rsatkichni   tasvirlashda
ishlatishingiz  kerak  bo’lgan  maxsus  qiymat   NULL  hyech  qayerda  belgilanmagan.  Agar
siz ko’rsatkich o’zgaruvchisini aniqlasangiz va ular boshlashga tayyor bo’lmasa , NULL
o’rnatishga   biroz   ertalik   qiladi.   double*   account_pointer   =   NULL;   //   Will   set   later
Malumotlarga NULL ko’rsatkichi orqali ulanishga harakat qilish noqonuniydir, u sizning
dasturingizni   bekor   qilinishiga   sabab   bo’lishi   mumkin   Quyidagi   dastur   ko’rsatkichning
xatti harakatini aniqlab beradi. Biz bir hil qaytarishni amalga oshiramiz ikki marta, lekin
hisob ko’rsatkichi uchun turi xil qiymatlar bilan bir hil hisob o’zgartiriladi
15  
  Funksiya   prototipida   yoki   aniqlanish   sarlavhasida   ko‘rsatilgan   parametrlar   formal
parametrlar deyiladi, funksiya chaqirishida ko‘rsatilgan argumentlarga faktikparametrlar
deyiladi. Funksiya chaqirilishida faktik parametming turi mos o‘rindagi formal parametr
turiga   to‘g‘ri   kelmasa   yoki   shu   turga   keltirishning   iloji   boMmasa   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‘midagi   kelgan   ifoda   qiymati   va   boshqa   argumentlaming   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   qiymatlami
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   boMishi   mumkin.   Faktik   parametr
adres   bilan  uzatilganda   unga   mos   keluvchi   formal   parametmi   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
16  
  o‘zgaruvchining adresi  (&  amal orqali)  yoki massiv  nomi, yoki  funksiya nomi  boMishi
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 void f(int,int*,int &) void main() { int i=l,j=2,k=3; cout<<i<<" "
<   <   j   «   "   "<<<i<<"   "   <   <   j   «   "   ''<++;   к ++   ;   *j=i+k;   k=*j+i;   }   Programma   ishlashi
natijasida   ekranga   quyidagi   qiymatlar   chop   qilinadi:   l   2   3   l   6   8   Bu   misolda   birinchi
parametr i qiymat bilan uzatiladi (“int i"). Uning qiymati funksiya ichida o‘zgaradi, lekin
tashqaridagi   i   o‘zgaruvchisining   qiymati   o‘zgarmaydi.   Ikkinchi   parametmi   ko‘rsatkich
orqali adresi bilan uzatilishi  talab qilinadi (“int *j”), adresni  uzatish uchun ‘&’- adresni
olish amali ishlatilgan (“&j”)- Funksiya tanasida argument adresidan qiymat olish uchun
‘*’-   qiymat   olish   amali   qoMlanilgan.   Uchinchi   parametrda   murojaat   orqali   (“&k”)
argumentning   adresi   uzatish   ko‘zda   tutilgan.   Bu   holda   funksiya   chaqirilishida   mos
argument   o‘mida   o‘zgaruvchi   nomi   turadi,   funksiya   ichida   esa   qiymat   olish   amalini
ishlatishning   hojati  yo‘q.  Funksiya  ishlash  natijasidagi  qiymatlami   argumentlar  ro‘yxati
orqali   olish   qulay   va   tushunarli   usul   hisoblanadi.   Agar   funksiya   ichida   adres   bilan
uzatiladigan   parametr   qiymati   o‘zgarmasdan   qolishi   zarur   bo‘lsa,   bu   parametr   const
modifikator   bilan   yozilishi   kerak:   fun(int   n,const   char*str);   Agarda   funksiyani
chaqirishda argumentlar faqat nomlari bilan berilgan bo‘lsa, kelishuv bo‘yicha massivlar
va   funksiyalar   adresi   bilan,   qolgan   turdagi   parametrlar   qiymatlari   bilan   uzatilgan   deb
hisoblanadi.   Misol   tariqasida   diskriminantni   hisoblash   usuli   yordamida   ax2+bx+c=0
ko‘rinishidagi   kvadrat   tenglama   ildizlarini   funksiya   parametrlari   vositasida   olish
masalasini   ko‘raylik.   #include   #include   int   Kvadrat_Ildiz(float   a,float   b,float   c,   float   &
xl, float & x2) { float D ; D=b*b-4*a*c; if(D<<"ax^2+bx+c=0 tenglama ildizini topish.
"; cout<<"\n a - koeffisiyentni kiriting: "; cin>>a; cout<<"\n b - koeffisiyentni kiriting: ";
cin>>b;   cout<<"\n   c   -   koeffisiyentni   kiriting:   ";   cin>>c;   switch
(Kvadrat_Ildiz(a,b,c,xl,x2))   (   case   0:   cout<<"Tenglama   haqiqiy   ildizga   ega   emas!";
break;   case   1:   cout   <<''Tenglama   yagona   ildizga   ega:   ";   cout<<"\n   x=   "   «   x   l   ;   break;
default:cout«"Tenglama   ikkita  ildizga   ega:   "  ;   c   out«"\nxl=   "   «  x   l   ;   cout«"\nx2=   "   «  x
2   ;   }   return   0;   }   Programmadagi   Kvadrat_Ildiz()   funksiyasi   kvadrat   tenglama   ildizini
hisoblaydi.   Uning   qaytaradigan   qiymati   tenglamaning   nechta   ildizi   borligini   anglatadi.
Agar   tenglamaning   haqiqiy   ildizi   mavjud   bo4masa   (D0   bo‘lsa   funksiya   2   qiymatini
qaytaradi. Mavjud ildizlar - xl va x2 adres oluvchi parametrlarda qaytariladi. C++ tilida
parametrlar soni noma’lum bo4gan funksiyalami ham ishlatish mumkin. Bundan tashqari
ulaming   turlari   ham   noma’lum   boMishi   mumkin.   Parametrlar   soni   va   turi   funksiyani
chaqirish-dagi argumentlar soni va ulaming turiga qarab aniqlanadi. Bunday funksiyalar
sarlavhasi   quyidagi   formatda   yoziladi:   (,...)   Bu   erda   -   oshkor   ravishda   yozilgan
parametrlar   nomi   va   turi.   Bu   parametrlar   majburiy   parametrlar   deyiladi.   Bunday
parametrlardan   kamida   bittasi   bo4ishi   shart.   Qolgan   parametrlar   soni   va   turi   noma’lum
17  
  hisoblanadi.   Ulami   aniqlash   va   ishlatish   to‘la   ravishda   programma   tuzuvchi   zimmasiga
yuklanadi.   0   ‘zgaruvchan   sondagi   parametrlami   tashkil   qilish   usuli   umuman   olganda
ikkita:   1-usul.   Parametrlar   ro‘yxati   oxirida   yana   bir   maxsus   parametr   yoziladi   va   uning
qiymati   parametrlar   tugaganligini   bildiradi.   Kompilyator   tomonidan   funksiya   tanasida
parametrlar   birma-bir   aniqlashtiriladi.   Barcha   parametrlar   turi   oxirgi   maxsus   parametr
turi   bilan   ustma-ust   tushadi   deb   hisoblanadi;   2-usul.   Birorta   maxsus   parametr   sifatida
noma’lum   parametrlar   soni   kiritiladi   va   unga   qarab   parametrlar   soni   aniqlanadi.   Ikkala
usulda ham parametrlarga murojaat qilish uchun ko‘rsatkichlar ishlatiladi.
. 
            5.Massivlar ko'rsatkichlar o'rnida
Ko'rsatkichlar   massivlarning   o'ziga   xosligini   tushunish   uchun   zarur.   Keyingi
bo'limlarda   massiv   va   ko'rsatkichlar   C++   da   bir   biriga   qanday   bog'liqligini   ko'rsatamiz
Massivning bayonotini oling: int a[10]; Bilganingizdek, a[3] massivni bildiradi. Qavssiz
massivning   nomi   ko'rsatkichning   boshlang'ich   elementini   bildiradi   Ko'rsatkichni
o'zgaruvchining   ichida   tasvirga   olishingiz   mumkin:   int*   p   =   a;   //   Now   p   points   to   a[0]
Shuningde,   ko'rsatkichning   o'rniga   massivning   nomini   ishlatishingiz   mumkin.   cout   <<
*a; Bu tasdiqlash pastdagi bilan bir xil ta'sirga ega cout << a[0];  Ko 'r sa t k i c h.   O 'z i n i n g
qi ym at i   si f a t i da   x ot i r a   m an zi l i i n i   ko 'r sa t u vc hi   ( s aq l o vc hi )   o' zg ar uv ch i l ar g a   -
ko 'r sa t k i c h  o 'z ga r u vc hi l a r   de yi l a di .
Ma sa l a n  :  K o' r s at ki ch ni ng   qi ym a t i
1 . 0 x 2 2 f f 4 0
2 . 0 x 2 2 f f 3 3
        3 . v a   x a k a z o   k a b i   x o t i r a n i n g   a n i q   q i s m i   b o ' l i s h i   m u m k i n .
Bo sh qa   o' zg ar uv ch i l ar   ka bi ,  k o' r s at ki ch l a r d an   f o yd al an i s h   uc hu n   ul ar n i   e 'l on
qi l i sh ,  t o i f a si ni   an i q l a sh  s ha r t
. int *countPtr, count;
bu   ye r d a   c ou nt Pt r   -   i n t   t oi f as i d ag i   ob 'e kt ga   k o' r s at ki ch ,   co un t   e sa   od di y
bu t u n   ( i n t )   t o i f a si da gi   o' zg ar uv ch i .   Ko 'r s at ki ch l a r n i   e 'l on   qi l i s hd a   h ar   b i r
o' zg ar uv ch i  ol di ga n  *  q o' yi l i sh i   sh ar t .
Maslahat:   Ko'rsatkich   o'zgaruvchilarini   e'lon   qilishning   uchta   usuli   mavjud,   ammo
birinchi usul afzal ko'riladi:
18  
  string* mystring;
string *mystring;
string * mystring;
* op er at or   (   de re f e re nc e   op er at or i )   yor da m i da   o' zg ar uv ch i n i n g   qi ym at i ni
ol i s h  u ch un  k o' r s at gi ch da n  f oy da l a ni sh i n gi z  m um ki n   :
#include <iostream>
#include <string>
using namespace std;
int main() 
{
      string food = "Palov";
      string* ptr = &food;         
cout << ptr << "\n";  
cout << *ptr << "\n";
    return 0;
}
0x6dfed4
Palov
Massiv   -   bir   xil   ma'lumot   turiga   ega   bo'lib   bir   nechta   o'zgaruvchini   har   birini   alohida
e'lon qilish o'rniga. Bir o'zgaruvchiga bir nechta qiymat saqlash uchun ishlatiladi. M a s s i v
e ' l o n   q i l i s h d a   o ' z g a r u v c h i   t u r i n i   a n i q l a n g   v a   s h u   b i l a n   b i r g a   u n g a   s a q l a n a d i g a n
e l e m e n t   t u r l a r i n i   a n i q l a n g
string  massiv[ 4 ];
En d i   b i z   t o 'r t a   q i y m a t n i   o ' z i g a   s a q l a s h   u c h u n   m u j j a l l a n g a n   m a s s i v n i   e 'l o n   q i l d i k .
u n g a   q i y m a t   y u k l a s h   u c h u n   q i y m a t l a r n i   v i r g ul   b i l a n   a j r a t i b   f i g u r n i y   q a v u s   i c h i d a
y o z i l a d i .   Q u y i d a g i g a   e 't i b o r   b e r i n g
string  massiv[ 4 ] = { "Master" ,  "Danayev" ,  "CPP" ,  "course" };
Uc h t a   b u t u n   s o n d a n   i b o r a t   q a t o r   y a r a t i s h   u c h u n   s i z   q u y i d a g i c h a   y o z i n g i z   z a r u r
b o 'l a d i . int  myNum[ 3 ] = { 913 ,  15 ,  96 };
Eslatma:   Massiv   indekslari   0   dan   boshlanadi:   [0]   birinchi   element.   [1]   ikkinchi
element va boshqalar
# include   <iostream>
19  
  # include   <string>
using   namespace  std;
int   main ()
  {
  string massiv[ 4 ] = { "Master" ,  "Danayev" ,  "CPP" ,  "course" };
    cout << massiv[ 0 ];
  return   0 ;
 }
Master
Massiv   elementini o'zgartirish.
Mu ay ya n   bi r  e l e m e nt ni  o 'z ga r t i r i sh   uc hu n  si z   m a ss i v  e l e m e nt i n i n g  i n de ks  
r a qa m i ga  m ur o j a at  q i l i b  o 'z ga r t i r i sh   i m k on i y at i g a  e ga  b o' l a si z.
# include   <iostream>
# include   <string>
using   namespace  std;
int   main ()   {
massiv[ 4 ] = { "Master" ,  "Danayev" ,  "CPP" ,  "course" };
massiv[ 0 ] =  "Mexroj" ;
cout << massiv[ 0 ];
return   0 ;
}
Mexroj
Massiv   elementlari alohida chiqarish.
Ma ss i v   el em en t l ar i n i   al oh i d a   ch i q ar i s h   u ch un          f or                  t s ki l   y oki
bo sh qa   t ak ro rl as h   op er at or l ar i da n   f oy da l a ni sh i n gi z   m u m ki n.   E s da n
ch i q ar m a ng   m as si v   l ar   b i l an   i sh l a sh da   ko 'p i n ch i   f or   t s i k l   d an   f o yd al an i s hi ng i z
m a qs ad ga  m uof f i q  h i s ob l a na di .
# include   <iostream>
# include   <string>
using   namespace  std;
20  
  int   main ()
{
string massiv[ 4 ] = { "Master" ,  "Danayev" ,  "CPP" ,  "course" };
  for ( int  i =  0 ; i <  4 ; i++)
 { cout << massiv[i] <<  "\n" ;}
return   0 ;
}
Master
Danayev
CPP
course
Qu y i d a g i   m i s o l   h a r   b i r   e l e m e n t   i n d e k s i n i   u n i n g   q i y m a t i   b i l a n   b i r g a   c h i q a r a d i :
# include   <iostream>
# include   <string>
using   namespace  std;
int   main ()   {
string massiv[ 4 ] = { "Master" ,  "Danayev" ,  "CPP" ,  "course" };
  for ( int  i =  0 ; i <  4 ; i++) {
 cout << i <<  ": "  <<    massiv[i] <<  "\n" ;}
  return   0 ;
}
0: Master
1: Danayev
2: CPP
21  
                 Massiv   elementlari qiymatlarini kiritish!
# include   <iostream>
# include   <string>
using   namespace  std;
int   main ()   {
string massiv[ 4 ];
for ( int  i =  0 ; i <  4 ; i++) {
cin >> massiv[i];}
    return   0 ; }                                                              
                                          6.Arifmetik ko'rsatkich  
Massivlarga   o'zgargan   ko'rsatkichlar   arifmetik   ko'rsatkichlarni   qo'llashadi.   Boshqa
massiv   joylashuvini   topish   uchun   ko'rsatkichga   butun   son   qo'shishingiz   mumkin.
Masalan, p massivning boshlanishini ko'rsatadi: 
 double a[10];
 double* p = a; 
So'ng
 p + 3 
ifodasi 3 indeksli massivning ko'rsatkichidir, va
 *(p + 3) massiv 3 - elementidir.
  Oldingi   bo'limda   ko'rganingizdek,   massiv   nomini   ko'rsatkichday   ishlatishimiz
mumkin. Bu degani, a + 3 3 indeksli massivning ko'rsatkichidir , va
 *(a + 3) a[3] 
bilan bir xil ma'noga ega. Umuman olganda, har bir butun son n ga 
a[n] *(a + n) 
bilan bir xil. Bu bog'liqlik massiv/ko'rsatkichning ikki taraflama qonunidir. Bu qonun
C++ da hamma massivlar nimaga 0 indeks bilan boshlanishini tushuntiradi. Ko'rsakich
a yoki (a + 0) massivning boshlanish elementini ko'rsatadi. Shuning uchun bu element
a[0] bo'lishi kerak. Arifmetik ko'rsatkichni  yaxshiroq tushunish uchun, haqiqiy xotira
22  
  manzilini   bilamiz   deb   tasavvur   qilaylik.   Tasavvur   qiling,   a   array   20300   manzilida
boshlanadi. Massiv double turidagi 10 ta baxoni o'z ichiga oladi. Double baxosi 8 bayt
xotirani egallaydi. Shuning uchun massiv 80 bayt xotirani egallaydi, 20300 dan 20379
gacha. Boshlang'ich  baxo 20300 manzilida joylashgan,  keyingisi  20308 manzilda, va
h.k Agar massiv va ko'rsatkichlar o'rtasidagi bog'liqlikni tushungan bo'lsangiz, massiv
parametrini   boshqa   turdagi   parametrlardan   farqini   bilasiz.Misol   tarzida,   massivning
hamma baxolarini yig'indisini hisoblaydigan funksiyani oling: double sum(double a[],
int   size)   219  {  double  total  =  0;   for  (int   i  =  0;  i  <  size;   i++)  {  total  =  total  +  a[i];  }
return   total;   }   Bu   yerda   funksiya   berilgan(4-tasvirni   ko'ring):   double   data[10];   ...   //
Initialize data double s = sum(data, 10); Baxoning ma'lumoti funksiyaning yig'indisida
berilgan.   u   odatda   double*   turidagi   ko'rsatkich,   massivning   boshlang'ich   elementini
ko'rsatadi.   Shuning   uchun   funksiya   shu   tarzda   bo'ladi   deb   kutiladi:   double
sum(double*   a,   int   size)   Biroq,   funksiyaga   yaxshilab   qarasangiz,parametrning
o'zgaruvchanligi   massivning   bo'sh   chegaralari   bilan   e'lon   qilinishini   ko'rasiz   double
sum(double a[], int size) C++ ning tuzuvchisiga ko'ra, bu parametrlar mutlaqo bir xil.
[]   bu   belgi   -   ko'rsatkichni   e'lon   qiladigan   "sintaktik   shakar".   (Kompyuter   olimlari   bu
terminni   odamlar   o'qishi   uchun   oson   va   mukammal   tafsilotlarni   yashirish   uchun
ishlatishadi.)   massiv   funksiyaga   berilgandek   tuyilishi   mumkin,   lekin   aslida   funksiya
massivning   faqat   boshlang'ich   manzilini   qabul   qiladi.   Endi   funksiyani   asosiga   shu
ifodani   oling:   total   =  total   +   a[i];   C++   ning   tuzuvchisi   a  ni   massiv   emas,   ko'rsatkich
qilib ko'rsatgan.  a[i]  ifodasi  220 *(a + i)  uchun sinkratik shakl  hisoblanadi.  Bu ifoda
hotira joylashuvining i elementlarini bildiradi, a o'zgaruvchining manzilini emas. i 3 ga
teng   bo'lganida   a[i]   qanday   qabul   qilinishini   ko'ramiz.   Massivning   kattaligini   doim
belgilash   nega   muxumligini   endi   tushundiz.   Funksiya   massiv   qayerda   boshlanishini
aytib turuvchi a manzilni qabul qiladi. Xotira manzili yordamida funksiya massivning
baxolarini joylashtiradi.Lekin funksiya qayerda to'xtashni ham bilishi kerak .
                 7.Ko'rsatkichlar-massivning o'zgaruvchanligi  
        Endi   bilganingizday,   funksiya   yig'indising   birinchi   parametri-bu   ko'rsatkich,
funksiyani   biroz   boshqacha   tarzda   ifoda   qilishingiz   mumkin.   Butun   son   indeksini
23  
  ko'paytirish o'rniga, massiv elementlarini ko'rish uchun ko'rsatkich o'zgaruvchanligini
ko'paytirishingiz mumkin:
 double sum(double* a, int size)
 { double total = 0; double* p = a; // p starts at the beginning of the array
 for (int i = 0; i < size; i++)
 { total = total + *p; // Add the value to which p points 
p++; // Advance p to the next array element 
}
 return total;
 } 
Aslida,   p   ko'rsatkichi   a[0]   elementini   ko'rsatadi.   p++   ning   ko'payishi;   uni   keyingi
elementga   olib   boradi   .Massiv   elementini   a[i]   qilib   qabul   qilgandan   ko'ra,   uni
ko'paytirgan maqul. Shu sababdan, ayrim programmistlar massiv elementlariga yetish
uchun indekslardan emas, ko'rsatkichlardan foydalanishadi.  
                        Aniq programmalashtiring 
  Ayrim   programmistlar   instruksiyalar   sonini   kamaytirishga   urunishadi,   natija   kodi
tushunish   uchun   qiyin   bo'lsa   ham.   Masalan,   bu   yerda   funksiya   yig'indisining   to'g'ri
joriy etilishi berilgan: double sum(double* a, int size) { double total = 0; while (size--
> 0) // Jarayon davomiyligi { total = total + *a++; // ; increment a } return total; } Bu 2
yo'l   bilan   amalga   oshirildi.   Birinchisi,   funksiyaning   parametri   va   o'lchami
o'zgaruvchan,   qiymatlarni   o'zgartirish-qonuniy.   Ifodalarning   o'lchami   --   va   ++
o'zgaruvchanning   ko'payishi   yoki   kamayishi   va   eski   baxosiga   qaytishini   anglatadi.
Boshqa   so'z   bilan   aytganda   size--   >   0   ifodasi   2   ta   vazifani   bajaradi:   o'lchamni
kamaytirish   va   undan   oldin   uni   pozitivligini   tekshirish.   Huddi   shunday   *a++   ifodasi
ko'rsatkichni keyingi elementga ko'paytiradi, va elementni ko'payishdan oldingi xoliga
qaytaradi.   Iltimos   bunday   programmalash   uslubini   ishlatmang.   Sizni   ishingiz   o'z
aqlingiz   bilan   boshqalarni   ko'zini   qamashtirish   emas,balki   tushunish   oson   bo'lgan
kodni yozish.
24  
                  Ko'rsatkichni o'z joyiga qaytarish 
  2   ta   elementli   massivga   ko'rsatkichni   qaytarmoqchi   bo'lgan   funksiyani   oling,
massivning birinchi va so'nggi baxolari: double* firstlast(double a[], int size) { double
result[2];   result[0]   =   a[0];   result[1]   =   a[size   -   1];   return   result;   //   Error!   }   Funksiya
ko'rsatkichni   massivning   boshlang'ich   elementiga  qaytardi.   Biroq,  bu   massiv   birinchi
funksiyaning   o'zgaruvchanidir.   Funksiya   chiqib   ketsa   o'zgaruvchan   ham
ketadi.Yaqinda   ular   boshqa   funksiyalar   bilan   to'ldiriladi.   Massivni   kesib   o'tib   mu
masalani yechishingiz mumkin: void firstlast(const double a[], int size, double[] result)
{   result[0]   =   a[0];   result[1]   =   a[size   -   1];   }   Massivni   joylashtirish   chaqiruvchining
zimmasida. 
                          Doimiy Ko'rsatkichlar
  Quyidagi   ifoda   doimiy   ko'rsatkichni   aniqlaydi:   const   double*   p   =   &balance;   P
ko'rsatkichdagi   baxoni   o'lachayolmaysiz.   Quyidagi   ifoda   noto'g'ri:   *p   =   0;   //   Error
Albatta,   baxoni   qisangiz   bo'ladi:   cout   <<   *p;   //   OK   Doimiy   massivning   parametr
o'zgaruvchanligi   doimiy   ko'rsatkichga   teng.   Masalan:   double   sum(const   double[]
values,   int   size)   .   Funksiya   shunday   aniqlanishi   mumkin:   double   sum(const   double*
values,   int   size)   Massiv   elementlarini   o'qish   uchun   funksiya   ko'rsatkich   baxolarini
ishlatadi, ammo ularni aniqlayolmaydi.
               III.   Xulosa
Biz bu mavzuda ko’rsatgichlar haqida ulardan qanday foydalanish haqida batafsil ko’rib 
chiqdik   va   ko’rsatgichlar   bizga   qanday   imkoniyatlar   yaratishini   ham   takidladik.
Programma matnida o‘zgaruvchi e’lon qilinganda, kompilyator o‘zgaruvchiga xotiradan
joy   ajratadi.   Boshqacha   aytganda,   programma   kodi   xotiraga   yuklanganda   berilganlar
uchun,  ular   joylashadigan  segmentning   boshiga   nisbatan  siljishini,   ya’ni  nisbiy   adresini
aniqlaydi   va   ob’ekt   kod   hosil   qilishda   o‘zgaruvchi   uchragan   joyga   uning   adresini
joylashtiradi.   Umuman   olganda,   programmadagi   o‘zgarmaslar,   o‘zgaruvchilar,
funksiyalar va sinf ob’ektlar adreslarini xotiraning alohida joyida saqlash va ular ustidan
amallar   bajarish   mumkin.   Qiymatlari   adres   bo‘lgan   o‘zgaruvchilarga   ko   ‘rsatkich   o
25  
  ‘zgaruvchilar   deyiladi.     Ko‘rsatkich   uch   xil   turda   bo4ishi   mumkin:   -   birorta   ob’ektga,
xususan   o‘zgaruvchiga   ko‘rsatkich;   -   funksiyaga   ko‘rsatkich;   -   void   ko‘rsatkich.
Ko‘rsatkichning   bu   xususiyatlari   uning   qabul   qilishi   mumkin   bo‘lgan   qiymatlarida
farqlanadi. Ko‘rsatkich albatta birorta turga bogMangan bo4ishi kerak, ya’ni u ko‘rsatgan
adresda   qandaydir   qiymatjoylanishi   mumkin   va   bu   qiymatning   xotirada   qanchajoy
egallashi   oldindan   ma’lum   boiishi   shart.   Ko‘rsatkichlar   ko‘pincha   dinamik   xotira
(boshqacha   nomi   «uyum»   yoki   «heap»)   bilan   bogMiq   holda   ishlatiladi.   Xotiraning
dinamik   deyilishiga   sabab,   bu   sohadagi   bo‘sh   xotira   programma   ishlashjarayonida,
kerakli   paytida   ajratib   olinadi   va   zarurat   qolmaganida   qaytariladi   (bo‘shatiladi).
Keyinchalik, bu xotira bo‘lagi programma tomonidan boshqa maqsadda yana ishlatilishi
mumkin.   Dinamik   xotiraga   faqat   ko‘rsatkichlar   yordamida   murojaat   qilish   mumkin.
Bunday   o‘zgaruvchilar   dinamik   o   ‘zgaruvchilar   deyiladi   va   ulami   yashash   vaqti
yaratilgan   nuqtadan   boshlab   programma   oxirigacha   yoki   oshkor   ravishda   yo‘qotilgan
(bogMangan   xotira  bo‘shatilgan)joygacha  boMadi.   Ko‘rsatkichlarni   e’lon  qiIishda  unga
boshlang4ch   qiymatlar   berish   mumkin.   Boshlang4ch   qiymat   (initsializator)   ko‘rsatkich
nomidan so‘ng yoki qavs ichida yoki *=’ belgidan keyin beriladi.
                                     IV.   Foydalangan adabiyotlar 
1.   Б .   Страуструп .   Язык   программирования   С++.   Специальное   издание.-
М.ЮОО «Бином-Пресс», 2006.-1104 с.
  2. Глушаков C.B., Коваль A.B., Смирнов C.B. Язык программирования С++:
Учебный курс.- Харьков: Фолио; М.: ООО «Издательство АСТ», 2001.-500c. 
3. Павловская T.A. С++. Программирование на языке высокого уровня - СПб.:
Питер. 2005.- 461 с.
 4. Подбельский B.B. Язык СИ++.- М.; Финансы и статистика- 2003 562c.
  5.   Павловская   T.C.   Щупак   Ю.С.   С/С++.   Структурное   программирование.
Практикум.-СПб.: Питер,2002-240с
  6   .   Павловская   T.C.   Щупак   Ю.С.   С++.   Объектно-ориентированное
программирование. Практикум.-СПб.: Питер,2005-265с 
26  
  7.   Юров   B.,   Хорошенко   С.   Assembler:   Учебный   курс-   СПб,   “Питер”,2000.-
672с. 8 . Абрамов C.A., Гнездилова Г.Г., Капустина E.H., Селюн М.И. Задачи
по программированию.-М.: Наука, 1988.-224c.
 9. A.A. Абдукодиров, У.М.Мирзаев СИ тилида программалаш асослари. Укув
кулланма, Тошкент, «Университет», 1994.-52 бет. 
10. A . A . Xaldjigitov ,   Sh . F . Madraximov ,   U . E . Adamboev   Informatika   va
programmalash . O ’quv qo’llanma, O’zMU, 2005 yil, 145 bet.
  11.A.A.Xaldjigitov,   Sh.F.Madraximov,   A.M.Ikromov,   S.I.Rasulov   Pascal   tilida
programmalash bo’yicha masalalar to’plami. O ’quv qo’llanma, O ’zMU, 2005 yil,
94 bet.
 
 
 
 
 
 
27

O’ZBEKISTON RESPUBLIKASI OLIY VA O’RTA MAXSUS TA’LIM VAZIRLIGI SHAROF RASHIDOV NOMIDAGI SAMARQAND DAVLAT UNIVERSITETI KURS ISHI Mavzu: Ko’rsatgichlar va ular bilan bajariladigan asosiy amallar. Samarqand-2023 Mundarija 1

I.Kirish......................................................................3 II.Asosi qism.............................................................5 1. Ko’rsatkichlar haqida umumiy tushuncha……..9 2. Ko’rsatkichdan foydalanish va uning ta’rifi…..13 3. O’zgaruvchiga ko’rsatkich orqali kirish………15 4. Boshlangich ko’rsatkichlar……………………18 5. Massivlar ko'rsatkichlar o'rnida……………….22 6. Arifmetik ko'rsatkich………………………….24 7. Ko'rsatkichlar - massivning o'zgaruvchanligi…25 III. Xulosa...............................................................26 IV.Foydalanilgan adabiyotlar..................................27 2

I. Kirish. Ko’rsatkich yordamida, joylashuvi farqlanishi mumkin. Bu hislat ko’p foydali taminga ega. Ko’rsatkichlar yordamida programmani turli qismlarini har hil ma’nolar almashuviga qarab ishlatishi mumkin. Undan tashqari 10 - bobda ko’rishiz mumkinki, ko’rsatkichlar programma tuzishda muhim ahamiyatga ega, bular obektlarni bog’liq turlarini boshqaradi. Bu bobda siz ko’rsatkichdan qanday foydalanishni bilib olasiz. Programma matnida o‘zgaruvchi e’lon qilinganda, kompilyator o‘zgaruvchiga xotiradan joy ajratadi. Boshqacha aytganda, programma kodi xotiraga yuklanganda berilganlar uchun, ular joylashadigan segmentning boshiga nisbatan siljishini, ya’ni nisbiy adresini aniqlaydi va ob’ekt kod hosil qilishda o‘zgaruvchi uchragan joyga uning adresini joylashtiradi.Umuman olganda, programmadagi o‘zgarmaslar, o‘zgaruvchilar, funksiyalar va sinf ob’ektlar adreslarini xotiraning alohida joyida saqlash va ular ustidan amallar bajarish mumkin. Qiymatlari adres bo‘lgan o‘zgaruvchilarga ko ‘rsatkich o ‘zgaruvchilar deyiladi. Ko‘rsatkich uch xil turda bo4ishi mumkin: - birorta ob’ektga, xususan o‘zgaruvchiga ko‘rsatkich; - funksiyaga ko‘rsatkich; - void ko‘rsatkich. Ko‘rsatkichning bu xususiyatlari uning qabul qilishi mumkin bo‘lgan qiymatlarida farqlanadi. Ko‘rsatkich albatta birorta turga bogMangan bo4ishi kerak, ya’ni u ko‘rsatgan adresda qandaydir qiymatjoylanishi mumkin va bu qiymatning xotirada qanchajoy egallashi oldindan ma’lum boiishi shart. Funksiyaga ko‘rsatkich. Funksiyaga ko‘rsatkich programma joylashgan xotiradagi funksiya kodining boshlang4ch adresini ko‘rsatadi, ya’ni funksiya chaqirilganda boshqaruv ayni shu adresga uzatiladi. Ko‘rsatkich orqali funksiyani oddiy yoki vositali chaqirish amalga oshirish mumkin. Bunda funksiya uning nomi bo‘yicha emas, balki funksiyaga ko‘rsatuvchi o‘zgaruvchi orqali chaqiriladi. Funksiyani boshqa funksiyaga argument sifatida uzatish ham funksiya ko‘rsatkichi orqali bajariladi. Funksiyaga ko‘rsatkichning yozilish sintaksisi quyidagicha: (* ) (); Bunda - funksiya qaytaruvchi qiymat turi; * - ko‘rsatkich o‘zgaruvchining nomi; - funksiya parametrlarining yoki ulaming turlarining ro‘yxati. Masalan: int (*fun) (float,float); Bu erda butun son turida qiymat qaytaradigan fun nomidagi funksiyaga ko‘rsatkich e’lon qilingan va u ikkita haqiqiy turdagi parametrlarga ega. Integral hisoblash funksiyasiga ko‘rsatkich orqali integrali hisoblanadigan funksiya adresi, a va b - integral chegaralari qiymatlari uzatiladi. Oraliqni bo‘lishlar soni - n global o'zgarmas qilib e’lon qilinadi 3

II. Asosiy qism. 1.Ko’rsatkichlar haqida umumiy tushuncha Ko‘rsatkich - xotira uyasining unikal adresini saqlaydigan o‘zgaruvchi. Ko‘rsatkich operativ xotiradagi biron-bir o‘zgaruvchi mavjud bo‘lishi mumkin bo‘lgan biron-bir joyni belgilaydi. Ko‘rsatkichlarning qiymatlarini o‘zgartirish, turli variantlarda qo‘llash mumkinki, bu dasturning moslashuvchanligini oshiradi.Ko‘rsatkich odatda tipga ega bo‘lib quyidagicha e’lon qilinadi: <turning nomi>*<ko‘rsatkichning nomi>=<dastlabki qiymat> Misol uchun: int *pr; char *alfa; Bu holda ko‘rsatkichlar noaniq qiymatga ega bo‘ladi. Ko‘rsatkichlar ta’riflanganda ularning tiplari ko‘rsatilishi shart. Ko‘rsatkichlarni initsializatsiya kilish ya’ni boshlang‘ich qiymatlarini kiritish mumkin. Ma’lum turdagi biron-bir o‘zgaruvchi adresi yoki NULL qiymat dastlabki qiymat bo‘lishi mumkin. Ko‘rsatkichlarga boshlang‘ich maxsus NULL qiymati berilsa bunday ko‘rsatkich bo‘sh ko‘rsatkich deb ataladi.Biron-bir o‘zgaruvchi adresini olish hamda uni ko‘rsatkichga qiymat sifatida berish uchun «&» operatori qo‘llanadi. Misol: int I=100; int*p=&I; unsigned longint *ul=NULL; Teskari operator - «*» bo‘lib, ko‘rsatkichda saqlanayotgan adres bo‘yicha uya qiymatiga murojaat qilish imkonini beradi. Misol: int I=100; int*p=&I; 4

int J=*p; Ilova tushunchasi. Ilova (ssыlka) – ilova ta’rifirda ko‘rsatilgan ob’ekt nomining sinonimi. Ilovani e’lon qilish shakli tur & ism =ism_ob’ekt; Misollar int x; // o‘zgaruvchining aniqlash int& sx=x; //x o‘zgaruvchiga iqtibosni aniqlash const char & CR='\n'; //konstantaga iqtibosni aniqlash Ilovalar bilan ishlash qoidalari. 1) O‘zgaruvchi ilova, agar u funksiya parametri bo‘lmasa, extern sifatida tavsiflanmagan bo‘lsa yoki sinf maydoniga ilova qilmasa, o‘ziga tavsif berilayotganda ochiq-oydin nomlanishi kerak. 2) Nomlangandan so‘ng, ilovaga boshqa qiymat berilishi mumkin emas. 3) Ilovalarga ko‘rsatkichlar, ilovalar massivlari va ilovalarga ilovalar bo‘lishi mumkin emas. 4) Ilova ustida o‘tkazilgan operatsiya o‘zi ilova qilayotgan qiymatning o‘zgarishiga olib keladi Ko‘rsatkichlar ustida o‘tkaziladigan operatsiyalar. Ko‘rsatkichlar ustida unar operatsiyalar bajarish mumkin: inkrement va dekrement ++ va -- operatsiyalarini bajarishda, ko‘rsatkich qiymati ko‘rsatkich murojaat qilgan tur uzunligiga ko‘payadi yoki kamayadi. Misol: int*ptr, a[10]; ptr=&a[5]; ptr++; */ = a[6]*/ elementining adresiga ptr--; */ = a[5]*/ elementining adresiga 5