Aqlli ko'rsatkichlar va harakat semantikasi
Aqlli ko'rsatkichlar va harakat semantikasi Reja : I. Kirish. II. Asosiy qism: a. Ko’rsatkichlar tushunchasi. b. Funksiyadagi ko’rsatkichlar. c. Obyektlarda ko’rsatkichlar . III. Xulosa
Kirish Ko’p dasturlash tillaridan farqli o’laroq C++ ishlash tezligi bln ajralib turadi. Bu dasturlash tili Bern Straustrup tomonidan yaratilingan bo’lib 1985 – yil oktabrda taqdim etilib, xuddi shu yili B.Straustrupning «C++ dasturlash tili» (The C++ Programming Language) kitobi bosilib chiqdi. C++ dasturi ishlash tezligi yuqori bo’lishiga sabablardan biri xotira bilan ishlash tizimidir yani dastur uchun xotiradan kerakli joyni olib qolib ortiqcha narsalar bilan to’ldirmaydi. Bunga misol qilib Ko’rsatkichlarni aytsak bo’ladi. Ko’rsatkichlar tushunchasi. 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’zgartirishni shunday turli variantlarda qo’llash mumkinki, bu dasturning moslashuvchanligini oshiradi. Ko’rsatkich odatda turga ega bo’lib quyidagicha e’lon qilinadi: <ma’lumot turi>*<identifikator> = <qiymat> Misol uchun: int *num; char *belgi; Bu holda ko’rsatkichlar noaniq qiymatga ega bo’ladi. Ko’rsatkichlar ta’riflanganda ularning turlari ko’rsatilishi shart. Ko’rsatkichlarni inisializasiya qilish, 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 uchun: #include <stdio.h> int main() { int i = 123; int *p = &i; printf("\n i = %d p = %p", i, p); int j = 456; p = &j;
printf("\n j = %d p = %p", j, p); return 0; } Natija: i = 123 p = 0012FF60 j = 456 p = 0012FF48 Teskari operator - «*» bo’lib, ko’rsatkichda saqlanayotgan adres bo’yicha uya qiymatiga murojaat qilish imkonini beradi. Misol: #include <stdio.h> int main() { int i = 123; int *si = &i; printf("\n i = %d *si = %d",i,*si); i = 456; printf("\n i = %d *si = %d",i,*si); *si = 0; printf("\n i = %d *si = %d",i,*si); return 0; } Natija: i = 123 *si = 123 i = 456 *si = 456 i = 0 *si = 0 Ko’rsatkichlar ustida o’tkaziladigan operasiyalar. Ko’rsatkichlar ustida unar operasiyalar bajarish mumkin: inkrement (++) va dekrement (--) operasiyalarini bajarishda, ko’rsatkich qiymati ko’rsatkich murojaat qilgan tur uzunligiga ko’payadi yoki kamayadi. Masalan: int*ptr, a[10]; ptr = &a[5];
ptr++; */ = a[6]*/ elementining adresiga ptr--; */ = a[5]*/ elementining adresiga Qo’shish va ayirish binar operasiyalarida ko’rsatkich va int turining qiymati ishtirok etishi mumkin. Bu operasiya natijasida ko’rsatkich qiymati dastlabkisidan ko’rsatilgan elementlar soniga ko’proq yoki kamroq bo’ladi. Masalan: int*ptr1, *ptr2, a[10]; int i = 2; ptr1 = a+(i+4); /* = a[6]*/ elementining adresiga ptr2 = ptr1-i; /* = a[4]*/ elementining adresiga Ayirish operasiyasida bitta turga mansub bo’lgan ikkita ko’rsatkich ishtirok etishi mumkin. Operasiya 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. Masalan: 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. Masalan: int *ptr1, *ptr2, a[10]; ptr1 = a + 5; ptr2 = a + 7; 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: <ma’lumot turi>* const<identifikator> = <konstant qiymat> Misol uchun: char* const key_byte = (char*)0x0417. Bu misolda konstanta ko’rsatkich klaviatura holatini ko’rsatuvchi bayt bilan bog’langandir. 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 holatini ham o’zgartiradi. Konstantaga ko’rsatkich quyidagicha ta’riflanadi: <ma’lumot turi> const* <identifikator> = <konstant qiymat> 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: <ma’lumot turi> const* <identifikator> = <konstant qiymat> 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 turidagi ko’rsatkichlar ajdodiy ko’rsatkichlar deb atalib har xil turdagi ob’ektlar bilan bog’lanish uchun ishlatiladi. Masalan: int i = 77; float euler = 2.18282; void *vp; vp = &I; printf(“%d”, (*(int*)vp); vp = &euler; printf(“%f”, (*(float*)vp); Quyidagi operatorlar ketma-ketligi xatolikka olib keladi:void *vp;int *ip; ip = vp;