Ko’rsatkichlar (pointers) — C++’ning eng kuchli va ayni paytda eng qo’rqinchli mavzusi deb hisoblanadi. Aslida esa g’oyasi oddiy: ko’rsatkich — bu boshqa o’zgaruvchining xotira manzilini saqlaydigan o’zgaruvchi. O’tgan darsda manzil bilan tanishdik; endi shu manzilni saqlab, u orqali ishlashni o’rganamiz.
Ko’rsatkich (pointer) — boshqa o’zgaruvchining xotira manzilini qiymat sifatida saqlaydigan maxsus o’zgaruvchi. U
*belgisi bilan e’lon qilinadi.
Ko’rsatkich e’lon qilish
Ko’rsatkich tur* nom shaklida e’lon qilinadi va unga & orqali olingan manzil beriladi:
#include <iostream>
using namespace std;
int main() {
int yosh = 26;
int* ptr = &yosh; // ptr — yosh ning manzilini saqlaydi
cout << "Qiymat: " << yosh << endl;
cout << "Manzil: " << ptr << endl;
return 0;
}
Qiymat: 26
Manzil: 0x7ffee1a2b3c4
int* ptr — butun songa ishora qiluvchi ko’rsatkich yaratdi, &yosh esa unga yosh ning manzilini berdi. Endi ptr yosh qayerda saqlanishini “biladi”.
Dereferensiya: * bilan qiymatga kirish
Ko’rsatkich orqali u ko’rsatayotgan qiymatga kirish uchun yana * ishlatiladi — bu dereferensiya deb ataladi:
#include <iostream>
using namespace std;
int main() {
int yosh = 26;
int* ptr = &yosh;
cout << "ptr orqali qiymat: " << *ptr << endl;
*ptr = 30; // ko'rsatkich orqali qiymatni o'zgartiramiz
cout << "yangi yosh: " << yosh << endl;
return 0;
}
ptr orqali qiymat: 26
yangi yosh: 30
Diqqat qiling: *ptr = 30 orqali yosh ning o’zi o’zgardi, garchi biz unga to’g’ridan-to’g’ri tegmagan bo’lsak ham. Bu — ko’rsatkichning butun mohiyati: bilvosita, manzil orqali boshqarish.
* belgisining ikki ma’nosi
Yangi o’rganuvchini chalkashtiradigan nozik nuqta: * ikki xil vazifada ishlatiladi. Ularni jadvalda ajratamiz:
| Kontekst | Ma’nosi |
|---|---|
int* ptr (e’londa) |
“ko’rsatkich” turini bildiradi |
*ptr (kodda) |
ko’rsatilgan qiymatga kiradi (dereferensiya) |
&yosh |
o’zgaruvchining manzilini oladi |
Nega ko’rsatkichlar muhim?
Ko’rsatkichlar C++’ning kuchli imkoniyatlari uchun asos bo’ladi: funksiyaga katta ma’lumotni nusxalamasdan uzatish, dinamik xotira ajratish, murakkab tuzilmalar (bog’langan ro’yxatlar, daraxtlar) qurish. Ular murakkab ko’rinsa-da, mohiyatan shunchaki “manzilni saqlovchi o’zgaruvchi”.
Ehtiyot bo’ling: hech qanday manzilga ishora qilmaydigan ko’rsatkich (nullptr) ni dereferensiya qilish dasturni qulatadi. Shuning uchun ko’rsatkichni doim to’g’ri manzil bilan boshlang.
Xulosa
Bu bo’limda ko’rsatkich e’lon qilish (int*), unga manzil berish (&), dereferensiya (*ptr) bilan qiymatni o’qish va o’zgartirishni, hamda * belgisining ikki ma’nosini ko’rib chiqdik. Ko’rsatkichlar — C++ ustaligining kaliti. Keyingi darsda funksiyalar — kodni qayta ishlatishga o’tamiz.