Ko’rsatgichlar va ular bilan bajariladigan asosiy amallar
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_1.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_2.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_3.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_4.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_5.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_6.png)
![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=π
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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_7.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_8.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_9.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_10.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_11.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_12.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_13.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_14.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_15.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_16.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_17.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_18.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_19.png)
![# 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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_20.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_21.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_22.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_23.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_24.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_25.png)
![‘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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_26.png)
![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](/data/documents/da069a9e-1e6c-4234-8ba5-a335457f9205/page_27.png)
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