Xotira manzili va ko’rsatkichlar — C’ni boshqa ko’plab tillardan ajratib turadigan eng muhim mavzu. Ko’rsatkichlar C’ning kuchi va qiyinligining manbai. Ular xotira bilan bevosita ishlash, katta ma’lumotni samarali uzatish va murakkab tuzilmalar qurish imkonini beradi. Ularni tushunmasdan turib C’ni to’liq egallab bo’lmaydi.
Ko’rsatkich (pointer) — boshqa o’zgaruvchining xotira manzilini saqlaydigan o’zgaruvchi. U
*belgisi bilan e’lon qilinadi,&esa manzilni oladi.
Manzil olish — & operatori
Har qanday o’zgaruvchining xotiradagi manzilini & operatori beradi:
#include <stdio.h>
int main(void) {
int yosh = 26;
printf("Qiymati: %d\n", yosh);
printf("Manzili: %p\n", (void*)&yosh);
return 0;
}
Qiymati: 26
Manzili: 0x7ffee3b4c9ac
yosh — qiymatni, &yosh — u saqlanayotgan xotira manzilini beradi. Manzil o’n oltilik (hex) ko’rinishda, %p format belgisi bilan chiqadi.
Ko’rsatkich e’lon qilish
Ko’rsatkich tur* nom shaklida e’lon qilinadi va unga & orqali olingan manzil beriladi:
#include <stdio.h>
int main(void) {
int yosh = 26;
int *ptr = &yosh; /* ptr — yosh ning manzilini saqlaydi */
printf("Manzil: %p\n", (void*)ptr);
printf("Qiymat: %d\n", *ptr); /* dereferensiya */
return 0;
}
Manzil: 0x7ffee1a2b3c4
Qiymat: 26
int *ptr — butun songa ishora qiluvchi ko’rsatkich, &yosh — unga manzil berdi. *ptr — dereferensiya, ya’ni ko’rsatkich ko’rsatayotgan qiymatga kirish.
* belgisining ikki ma’nosi
Yangi o’rganuvchini chalkashtiradigan nozik nuqta. Ularni jadvalda ajratamiz:
| Kontekst | Ma’nosi |
|---|---|
int *ptr (e’londa) |
“ko’rsatkich” turini bildiradi |
*ptr (kodda) |
ko’rsatilgan qiymatga kiradi |
&yosh |
o’zgaruvchining manzilini oladi |
Ko’rsatkich orqali o’zgartirish
Ko’rsatkich orqali asl o’zgaruvchini o’zgartirish mumkin:
#include <stdio.h>
int main(void) {
int yosh = 26;
int *ptr = &yosh;
*ptr = 30; /* ko'rsatkich orqali qiymatni o'zgartiramiz */
printf("Yangi yosh: %d\n", yosh);
return 0;
}
Yangi yosh: 30
*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: manzil orqali bilvosita boshqarish.
Xulosa
Bu bo’limda xotira manzili (&), ko’rsatkich e’lon qilish (int *), dereferensiya (*ptr) va ko’rsatkich orqali qiymatni o’zgartirishni ko’rib chiqdik. Ko’rsatkichlar — C ustaligining kalitidir. Keyingi darsda funksiyalarga o’tamiz.