1. Sintaksisga kirish Dastur yaratish muhiti


Ko‘rsatkichlar bilan amallar



Yüklə 1,17 Mb.
səhifə26/34
tarix19.09.2022
ölçüsü1,17 Mb.
#63802
1   ...   22   23   24   25   26   27   28   29   ...   34
1 kurslarga moljallangan Dasturlash 2 fanidan C Builder muhitida (2)

Ko‘rsatkichlar bilan amallar


Ko‘rsatkichlar ustida inkrement va dekrement unar amallarini bajarish mumkin. ++ va -- amallari bajarilganda ko‘rsatkichning qiymati ishlatilayotgan ko‘rsatkich ko‘rsatayotgan tur uzunligiga oshiriladi yoki kamaytiriladi.
Misol:
int *ptr, a[10];
ptr=&a[5];
ptr++; /* a[6] element manziliga teng */
ptr--; /* a[5] element manziliga teng */

Qo‘shish va ayirish binar amallarida int turidagi kattalik va ko‘rsatkich qatnashishi mumkin. Bu holda amalning natijasi joriy turdagi ko‘rsatkich bo‘ladi, uning qiymati esa joriynikidan ko‘rsatilgan element sonicha ortiq yoki kam bo‘ladi.


Misol:
int *ptr1, *ptr2, a[10];
int i=2;
ptr1=a+(i+4); /* a[6] element manziliga teng */
ptr2=ptr1-i; /* a[4] element manziliga teng */

Ayirish amalida bitta umumiy turga tegishli ikkita ko‘rsatkich qatnashishi mumkin. Bu amalning natijasi int turiga tegishli va joriy turdagi kamayuvchi va ayriluvchi o‘rtasidagi elemenlar soniga teng. Chunonchi agar birinchi manzil kam 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 ga teng */
i=ptr2-ptr1; /* -5 ga teng */

Bir xil turli ikkita ko‘rsatkichning qiymatlarini ==, !=, <, <=",">, >= amallari yordamida taqqoslash mumkin, bu holda ko‘rsatkichlarning qiymatlari oddiy butun sonlar kabi qaraladi, taqqoslashning natijasi esa 0 (yolg‘on) yoki 1 (rost) ga teng.


Misol:
int *ptr1, *ptr2, a[10];
ptr1=a+5;
ptr2=a+7;
if (prt1>ptr2) a[3]=4;

Bu misolda ptr1 ning qiymati ptr2 ning qiymatidan kichik va shuning uchun ham a[3]=4 buyrug‘i bajarilmaydi.


Ko‘rsatkichlar massivi


C tilida massivning elementlari ixtiyoriy turga ega bo‘lishi mumkin, jumladan, ixtiyoriy turdagi ko‘rsatkich ham bo‘lishi mumkin. Ko‘rsatkichlardan foydalanishga oid bir nechta misollar ko‘ramiz
int a[]={10,11,12,13,14,};
int *p[]={a, a+1, a+2, a+2, a+3, a+4};
int **pp=p;
sxemada tasvirlangan dastur ob’yektlarini hosil qiladi






pp






p



.

.

.

.

.














a



11

12

13

14

15

E’lon qilishda o‘zgaruvchilarning joylashish sxemasi.

pp-p amali bajarilganda nol qiymatga ega bo‘lamiz, chunki pp va p murojaatlar teng va p ko‘rsatkich bilan bog‘liq (p[0] elementga) ko‘rsatkich massivining boshlang‘ich elementini ko‘rsatadi. pp+q2 amal bajarilganda sxema o‘zgaradi va quyidagi ko‘rinishni oladi:








pp






p



.

.

.

.

.




















a



10

11

12

13

14




O‘zgaruvchilarning pp+q2 amali bajarilgandan so‘nggi joylashish sxemasi.




pp ning qiymati p massivning uchinchi elementining manzili bo‘lganligi sababli, pp-p ayirish bajarilganda natija 2 ga teng bo‘ladi. *pp-a murojaat ham 2 qiymatni beradi, chunki *pp murojaat a massivning uchinchi elementining manzili bo‘ladi. a murojaat esa massiv boshlang‘ich elementining manzilini beradi. **pp murojaat yordamida murojaat qilinganda 12 qiymatga ega bo‘lamiz, chunki bu a massivning uchinchi elementining qiymatidir. *pp++ murojaat p massivning to‘rtinchi elementining qiymatini beradi, ya’ni a massivning to‘rtinchi elementi manzili.


Agar pp=p deb faraz qilsak, u holda *++pp murojaat a massivning birinchi elementi qiymatini beradi (ya’ni 11 qiymatni), ++*pp amali p[0] ko‘rsatkichning qiymatini o‘zgartiradi, shunday qilib u a[1] element manzilining qiymatiga teng bo‘ladi.
Murakkab murojaatlar ichkaridan boshlab ochiladi. Masalan, *(++(*pp)) murojaatni quyidagi amallarga ajratish mumkin: *pp p[0] massivning boshlang‘ich elementining qiymatini beradi, so‘ngra bu qiymat ++(*p) ga inkrementatsiya qilinadi va natijada p[0] ko‘rsatkich a[1] element manzilining qiymatiga teng bo‘ladi. Oxirgi amalda hosil qilingan manzilning qiymati olinadi, ya’ni 11 qiymat.
Oldingi misollarda bir o‘lchovli massiv ishlatilgan edi, hozir esa ko‘p o‘lsovli massiv va ko‘rsatkichlarga misollar ko‘ramiz. O‘zgaruvchilarni quyidagicha e’lon qilish
int a[3][3]={ { 11,12,13 },
{ 21,22,23 },
{ 31,32,33 } };
int *pa[3]={ a,a[1],a[2] };
int *p=a[0];
e’lon qilish dasturda pastdagi sxemada ko‘rsatilgan ob’yektlarni hosil qiladi
.
Ko‘rsatkichlarning ikki o‘lchovli massivda joylanishi.

Bu sxemaga asosan a[0][0] elementga murojaatni a, p, pa ko‘rsatkichlar orqali a[0][0], *a, **a[0], *p, **pa, *p[0] murojaat yordamida olish mumkin.


Hozir esa belgilar qatorini ishlatishga misol ko‘ramiz. O‘zgaruvchilarni quyidagicha
char *c[]={ "abs", "dx", "yes", "no" };
char **cp[]={ c+3, c+2 , c+1 , c };
char ***cpp=cp;
e’lon qilish pastda keltirilgan rasmdagi sxemadagidek tasvirlashi mumkin.

Ko‘rsatkichlarning satrda joylanish sxemasi.

Yüklə 1,17 Mb.

Dostları ilə paylaş:
1   ...   22   23   24   25   26   27   28   29   ...   34




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©azkurs.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin