12. Ko‘rsatkichlar — Pointers¶
Ko‘rsatkichlar C tilining muhim mavzularidan biridir.
Boshida ular biroz qiyin tuyulishi mumkin.
Lekin asosiy g‘oyani tushunish juda oson:
Ko‘rsatkich — boshqa o‘zgaruvchining xotiradagi manzilini saqlaydigan o‘zgaruvchi.
Avval oddiy o‘zgaruvchini ko‘ramiz.
O‘zgaruvchi xotirada saqlanadi¶
Masalan:
int yosh = 18;
Dastur 18 qiymatini kompyuter xotirasida saqlaydi.
Buni oddiy qilib shunday tasavvur qilish mumkin:
yosh
↓
18
Har bir xotira joyining o‘z manzili bo‘ladi.
Masalan, shartli ravishda:
yosh
↓
[18]
1000
Bu yerda 1000 — xotira manzili deb tasavvur qilaylik.
O‘zgaruvchining manzilini olish¶
C tilida o‘zgaruvchining xotiradagi manzilini olish uchun & operatoridan foydalanamiz.
Masalan:
#include <stdio.h>
int main() {
int yosh = 18;
printf("%p", &yosh);
return 0;
}
Natija taxminan shunday bo‘lishi mumkin:
0x7ffd1234
Bu manzil har bir kompyuterda boshqacha bo‘lishi mumkin.
Muhimi:
&yosh
yosh o‘zgaruvchisining xotiradagi manzilini bildiradi.
Pointer nima?¶
Pointer — xotira manzilini saqlaydigan o‘zgaruvchi.
Masalan:
int yosh = 18;
int *p = &yosh;
Bu yerda:
yosh
oddiy int o‘zgaruvchi.
&yosh
yosh ning manzili.
p
esa shu manzilni saqlayotgan pointer.
Buni shunday tasavvur qilish mumkin:
yosh
↓
[18]
p
↓
yoshning manzili
* belgisi¶
Pointer yaratishda * belgisi ishlatiladi.
Masalan:
int *p;
Bu:
p
int qiymatining manzilini saqlashi mumkinligini bildiradi.
Masalan:
int yosh = 18;
int *p = &yosh;
Pointer orqali qiymatni olish¶
Pointer saqlayotgan manzildagi qiymatni olish uchun * ishlatiladi.
Masalan:
#include <stdio.h>
int main() {
int yosh = 18;
int *p = &yosh;
printf("%d", *p);
return 0;
}
Natija:
18
Bu yerda:
p
manzilni saqlaydi.
*p
esa shu manzildagi qiymatni oladi.
& va *¶
Bu ikkita belgini farqlash muhim.
& — o‘zgaruvchining manzilini oladi.
&yosh
* — pointer ko‘rsatayotgan qiymatni oladi.
*p
Masalan:
int yosh = 18;
int *p = &yosh;
Bu yerda:
&yosh → yoshning manzili
p → shu manzil
*p → 18
Pointer orqali qiymatni o‘zgartirish¶
Pointer yordamida asl o‘zgaruvchining qiymatini ham o‘zgartirish mumkin.
Masalan:
#include <stdio.h>
int main() {
int yosh = 18;
int *p = &yosh;
*p = 20;
printf("%d", yosh);
return 0;
}
Natija:
20
Nima bo‘ldi?
Avval:
yosh = 18
Pointer yosh ning manzilini ko‘rsatmoqda.
Keyin:
*p = 20;
deb yozdik.
Natijada yosh ham 20 bo‘ldi.
Pointerni oddiy tasavvur qilish¶
Quyidagicha tasavvur qiling:
yosh
↓
[18]
Pointer:
p
↓
yoshning manzili
*p orqali:
p
↓
yosh
↓
18
qiymatiga yetib boramiz.
Pointer va printf()¶
Pointerning o‘zini chiqarish uchun %p ishlatiladi.
Masalan:
#include <stdio.h>
int main() {
int son = 10;
int *p = &son;
printf("%p", (void *)p);
return 0;
}
Natija kompyuterga qarab har xil bo‘ladi.
Masalan:
0x7ffd123456
Manzilning aniq qiymati muhim emas.
Muhimi, pointer xotira manzilini saqlaydi.
Pointer turi¶
Pointer ham ma'lum bir turga ega bo‘ladi.
Masalan:
int *p;
int qiymatining manzilini saqlaydi.
float uchun:
float *p;
char uchun:
char *p;
Masalan:
int son = 10;
int *p = &son;
Bu to‘g‘ri.
Pointer bilan oddiy misol¶
#include <stdio.h>
int main() {
int son = 10;
int *p = &son;
printf("Son: %d\n", son);
printf("Pointer orqali: %d\n", *p);
return 0;
}
Natija:
Son: 10
Pointer orqali: 10
Ikkalasi ham bir xil qiymatni chiqaradi.
Pointer nima uchun kerak?¶
Pointerlar C tilida juda ko‘p ishlatiladi.
Masalan:
- funksiyalarga o‘zgaruvchini o‘zgartirish imkonini berish;
- massivlar bilan ishlash;
- xotirani boshqarish;
- murakkab ma'lumotlar tuzilmalarini yaratish.
Hozircha pointerlarning hammasini bilish shart emas.
Eng muhim tushuncha:
Pointer qiymatning o‘zini emas, uning xotiradagi manzilini saqlaydi.
Funksiya va pointer¶
Pointerlarning foydali tomonlaridan biri funksiyalar bilan ishlaganda ko‘rinadi.
Masalan:
#include <stdio.h>
void ozgartir(int *son) {
*son = 100;
}
int main() {
int son = 10;
ozgartir(&son);
printf("%d", son);
return 0;
}
Natija:
100
Bu yerda ozgartir() funksiyasiga son ning manzili berildi.
Funksiya esa pointer orqali asl son qiymatini o‘zgartirdi.
Hozircha bu kodning har bir detalini tushunmasangiz ham mayli.
Keyingi mavzularda bunga yana qaytamiz.
Pointer yaratishda ehtiyot bo‘ling¶
Quyidagiga o‘xshash pointer yaratish xavfli:
int *p;
Agar p ga hech qanday manzil berilmasa, uning ichida noma'lum qiymat bo‘lishi mumkin.
Shuning uchun odatda pointerga foydalanishdan oldin manzil beramiz:
int son = 10;
int *p = &son;
NULL pointer¶
Pointer hech narsani ko‘rsatmasligi uchun NULL ishlatilishi mumkin.
Masalan:
int *p = NULL;
Bu pointer hozircha hech qanday o‘zgaruvchining manzilini ko‘rsatmayapti.
NULL pointer orqali qiymat olishga urinmaslik kerak.
Masalan, bunday kod noto‘g‘ri:
int *p = NULL;
printf("%d", *p);
Hozircha NULL ni:
"pointer hech narsani ko‘rsatmayapti"
deb eslab qolish kifoya.
Amaliy mashqlar¶
1-mashq¶
Quyidagi dasturda son ning manzilini chiqaring:
int son = 50;
printf("%p", (void *)&son);
2-mashq¶
Pointer yordamida son qiymatini chiqaring:
int son = 50;
int *p = &son;
Natija:
50
bo‘lishi kerak.
3-mashq¶
Pointer yordamida son qiymatini 100 ga o‘zgartiring.
Boshlanishi:
int son = 50;
int *p = &son;
Natija:
100
bo‘lishi kerak.
4-mashq¶
Quyidagi kod nima chiqaradi?
int son = 25;
int *p = &son;
printf("%d", *p);
5-mashq¶
Quyidagi kodni tushunishga harakat qiling:
void ozgartir(int *son) {
*son = 50;
}
int main() {
int son = 10;
ozgartir(&son);
printf("%d", son);
return 0;
}
Natijani oldindan toping.
Muhim narsalarni eslab qoling¶
O‘zgaruvchining manzilini olish:
&son
Pointer yaratish:
int *p;
Pointerga manzil berish:
int *p = &son;
Pointer orqali qiymatni olish:
*p
Pointer orqali qiymatni o‘zgartirish:
*p = 100;
Pointerning asosiy vazifasi:
xotira manzilini saqlash.
Xulosa¶
Pointer — boshqa o‘zgaruvchining xotiradagi manzilini saqlaydigan o‘zgaruvchi.
Masalan:
int son = 10;
int *p = &son;
Bu yerda p son ning manzilini saqlaydi.
*p orqali esa son ning qiymatiga murojaat qilishimiz mumkin.
Pointerlar C tilida juda muhim mavzu hisoblanadi.