Ko'rsatkichlar (pointers) nima uchun kerak?
Loyihani qo'llab quvvatlash uchub buyerga bosing
C oilasiga tegishli dasturlash tillarida ishlab ko’rganlar ko’rsatkichlar haqida eshitishgan, ko’rishgan, bilishadi. Afsuski dasturlashni endigina boshlaganlarning barchasi ham bularning vazifasi haqida bilavermaydi va shu sabab turli savollar berib yurishadi.
Ko’rsatkichlar nima?
Qiymat sifatida xotira manzilini ko’rsatuvchi (saqlovchi) o’rgaruvchilar.
Misol sifatida oddiy o’zgaruvchidagi qiymatni ekranga chiqarishni olaylik:
#include <stdio.h>
int main() {
int x = 5;
printf("Qiymat: %d", x);
return 0;
}
Yuqoridagi holatda ekranga Qiymat: 5
xabari chiqadi.
Quyida esa x
o’zgaruvchising xotiradagi manzili olib ko’ramiz. Bunda bizga javob sifatida hex formatdagi xotira manzili ko’rsatiladi.
#include <stdio.h>
int main() {
int x = 5;
printf("Ko'rsatkich: %x", &x);
return 0;
}
Ekran: Ko'rsatkich: 4a07eff4
Ko’rsatkichlardan foydalanish
Tasavvur qilib ko’raylik: funksiya uchun son beraylik va u sonni birga ko’paytirsin.
#include <stdio.h>
void func (int x) {
x = x+1;
}
int main() {
int x = 5;
func(x);
printf("Qiymat: %x", x);
return 0;
}
Ekran: Natija: 5
Ushbu holatda biz func
funksiyasiga bergan x
o’zgaruvchimiz qiymati funksiya ichida bittaga ko’paymoqda lekin natija sifatida esa boshlang’ich qiymat ko’rsatilmoqda. Chunki funksiyamiz ichida x
qimayti nusxalanmoqda.
Endi yuqoridagi misolga ko’rsatkichlarda qarasak:
#include <stdio.h>
void func (int* x) {
*x = *x+1;
}
int main() {
int x = 5;
func(&x);
printf("Qiymat: %x", x);
return 0;
}
Ekran: Natija: 6
Ushbu holatda o’zgaruvchiga ko’rsatkich uzatildi va xotiraga kirish huquqi orqali qiymat o’zgartirildi.
Bu nima uchun kerak?
Har qanday dastur o’z ishini bajarishi uchun operativ xotiraga yuklanadi. Operativ xotirada ma’lumotlarni saqlash uchun turli manzillar belgilangan. Agarda dastur qurilmadagi ajratilgan resursdan ko’ra ko’proq xotira talab qilsa, dasturning ish faoliyati buziladi. Ba’zi holatlarda bu butun boshli OSning ishdan chiqishiga ham olib keladi.
Oddiyroq GTA 5 o’yinini olaylik. Ushbu o’yin diskdan o’rtacha 50 Gb atrofida xotira talab qiladi. Lekin siz uni bemalol 8 Gb hajmga ega operativ xotira bilan o’ynashingiz mumkin. Real vaqtdagi obyektlar harakati, o’yindagi kadrlarning almashib turishi katta resurs orqali ishlaydi. Lekin 50 Gb hajmdagi o’yinni dasturchilar 8 Gblik xotirada ishga tushirishmoqda.
Sirli masalliqning siri esa ko’rsatkichlarda hisoblanadi. Ya’ni katta hajmdagi dasturiy ta’minot kodlari turli ma’lumotlarni almashinish jarayonida har bir o’zgaruvchilarni alohida xotira kataklariga yozavermaydi. Shunchaki ular xotira manzillarini eslab qoladida ma’lumot almashinishni shu joy orqali amalga oshiradi. Ya’ni eski keraksiz ma’lumot manziliga yangisini yozib ketaveradi.
Misol siz o’yin ichida avtomobil boshqarib ketyapsiz, shahar kartasi uchun xotiradan 75e0000
manzilidan toki 75efffff
manziligacha o’zgaruvchilar uchun ajratilgan xotiraga real vaqtdagi karta holati generatsiya qilib joylanib ketilaveriladi. Bu orqali esa 10 Gb resurs talab qiladigan o’yin kartasini 1 Gb (taxminiy) xotirada ishlatish mumkin bo’ladi.