8-ma’ruza. Ko’rsatkichlar va dinamik xotira bilan ishlash
Maqsad:
Ko’rsatkich nimaligini tavsiflash
Ko’rsatkich qanday e’lon qilisnishini va xotira adresiga ta’minlashni o’rganish
Qiymatlarga ko’rsatkichlar orqali murojaat qilish
typedef kalit so’zi orqali sinonim turlarni yaratish
Konstanta ko’rsatkichlar va ma’lumotlarni e’lon qilish
Massivlar va ko’rsatkichlar o’rtasidagi bog’liklikni tushuntirish
Ko’rsatkich o’zgaruvchilari ko’rsatkichlar nomi bilan ham ma’lum. Siz ko’rsatkichdan massiv, ob’yekt va o’zgaruvchilarning adreslariga havola qilishda foydalanasiz. Ko’rsatkichlar C++ ning eng asosiy tushunchalaridan biri hisoblanadi. C++ ning ko’pgina tushunchalari va kutubxonalarini yaratishda ko’rsatkichlardan foydalanilgan. Ko’rsatkichlarni nima uchun muhimligini bilish uchun butun sonlarda qarab chiqamiz. Siz massivda butun sonlarni saqlamoqchisiz. Ammo massivning o’lchamini bilmagan holda uni qanday yaratasiz? Butun sonlarni qo’shish yoki o’chirish natijasida massiv o’lchami o’zgarib turishi mumkin. Buning uchun dastur bajarilayotganda sizga butun sonlar uchun xotiradan joy ajratib turgich va bo’shatib turgich lozim bo’ladi. Bu jarayonni ko’rsatkichlar amalga oshirib beradi.
Ko’rsatkich o’zgaruvchisi oz’ida xotira adresini saqlaydi. * operatori orqali maxsus xotira sohasidagi qiymatga murojaatni amalga oshira olasiz. Ko’rsatkich o’zgaruvchilari, soddaroq aytganda, ko’rsatkichlar o’zlarining qiymati sifatida xotira adreslarini saqlaydi. Odatda, o’zgaruvchi ma’lumot qiymatini o’zida saqlaydi, misol uchun, butun, haqiqiy va belgili qiymatlar. Ammo ko’rsatkich o’zgaruvchining xotira adresini o’zida saqlaydi.
Yulduzcha operatori
operatori bevosita operator(indirection operator) yoki qayta havolalash operatori(dereference operator) nomlari bilan ham ma’lum. Ko’rsatkich qayta havola qilinganda (dereferenced), ko’rsatkichga adresda saqlanayotgan qiymat olinadi.
Ko’rsatkichlar bilan ishlashda quyidagilar ahamiyatlidir:
C++ yulduzchadan (*) uch turli holatlarda foydalaniladi:
Ko’paytirish operatori sifatida;
Ko’rsatkich o’zgaruvchisini e’lon qilishda:
int* pCount=&count;
Qayta havola qilinuvchi operator(dereference operator) sifatida:
(*pCount)++;
Xavotirlanmang. Kompilyatorning o’zi yulduzcha operatorining nima maqsadda ishlatilishini aniqlab oladi.
Ko’rsatkichlar int yoki double kabi turlarda e’lon qilinadi. O’zgaruvchi adresiga ko’rsatkich qaysi turda e’lon qilinsa, aynan shu turda qiymat ta’minlash lozim. Masalan quyidagi kod xatolik beradi:
int area=1;
double* pArea=&area; //Xato
Siz bir turdagi bir ko’rsatkichni boshqa ko’rsatkichga ta’minlay olasiz, ammo ko’rsatkichni ko’rsatkich bo’lmagan o’zgaruvchiga ta’minlay olmaysiz:
int area=1;
double* pArea=&area;
int i=pArea; //Xato
Ko’rsatkichlar bu o’zgaruvchilar. Shuning uchun o’zgaruvchilarni nomlash konvensiyasi ko’rsatkichlarga ham qo’llaniladi. Farqli jihati shundaki, ko’rsatkichlarni nomlashda p harfini qo’yib ketamiz, pCount va pArea singari.
typedef kalit so’zi yordamida sinonim turlar hosil qilinadi. unsigned int ning sinonimi sifatida unsigned ishlatiladi. C++ da typedef kalit so’zi yordamida sinonim turlarni yaratishga imkoniyat mavjud. Sinonim turlardan kodlash jarayonini soddalashda va xavfli xatolardan qochishda foydalaniladi.
Uning sintaksisi quyidagicha:
typedef mavjudTur yangiTur;
Misol uchun, quyidagi komandada int turning sinonimi bo’lmish integer aniqlanmoqda:
typedef int integer;
integer qiymat=40;
Typedef orqali yangi tur yaratilmaydi. U asosan ko’rsatkichlar nomlarini o’qishni osonlashtiradi. Misol uchun, int* uchun intPointer turini aniqlaymiz:
typedef int* intPointer;
Endi int turidagi ko’rsatkich o’zgaruvchisini quyidagicha e’lon qilish mumkin:
intPointer p; int* p;
int* p1, p2;
intPointer p1, p2;
Konstanta ko’rsatkich konsatnta xotira sohasini ko’rsatadi, ammo xotira sohasidagi qiymat o’zgarishi mumkin. Bilasizki, konsatntalarni o’zgartirish mumkin emas. Siz konstanta ko’rsatkich e’lon qilishingiz mumkin. Misol uchun,
double radius = 5;
double* const p = &radius;
Bu yerda p konstanta ko’rsatkich. Keyinroq p ga boshqa adresni ta’minlay olmaymiz. Bu yerda faqat p konstanta, p orqali ko’rsatilayotgan ma’lumot esa konstanta emas. Siz uni o’zgartirishingiz mumkin.
*p=10;
Bu holatda ko’rsatkich ham, ma’lumot ham konstanta.
Agar siz ko’rsatkichni quyidagicha e’lon qilsangiz:
const double* p=&radius;
u holda ko’rsatkich konsatnta emas, ammo ko’rsatkich ko’rsatatyotgan ma’lumot konsatnta. Misol uchun,