12. Pointerlar¶
Pointerlar C++ tilining muhim mavzularidan biridir.
Avvaliga pointerlar biroz qiyin tuyulishi mumkin. Shuning uchun bu bobda ularni juda oddiy usulda o‘rganamiz.
Pointer — boshqa o‘zgaruvchining xotiradagi manzilini saqlaydigan o‘zgaruvchi.
Xotira manzili nima?¶
Kompyuter o‘zgaruvchilarni xotirada saqlaydi.
Masalan:
int yosh = 18;
yosh o‘zgaruvchisining xotirada ma'lum bir manzili bo‘ladi.
Manzilni & operatori yordamida olishimiz mumkin.
cout << &yosh;
Natija taxminan shunday bo‘lishi mumkin:
0x61ff08
Bu son xotiradagi manzilni bildiradi.
Manzil har bir kompyuterda boshqacha bo‘lishi mumkin.
& operatori¶
& o‘zgaruvchining xotira manzilini olish uchun ishlatiladi.
Masalan:
int yosh = 18;
cout << &yosh;
Bu yosh ning xotiradagi manzilini chiqaradi.
Pointer nima?¶
Pointer boshqa o‘zgaruvchining manzilini saqlaydi.
Masalan:
int yosh = 18;
int* ptr = &yosh;
Bu yerda:
yosh
oddiy int o‘zgaruvchi.
ptr
esa yosh ning xotira manzilini saqlaydigan pointer.
* belgisi¶
Pointer yaratishda * ishlatiladi.
Masalan:
int* ptr;
Bu:
ptr — int turidagi qiymatning manzilini saqlaydigan pointer.
degan ma'noni anglatadi.
Pointer misoli¶
#include <iostream>
using namespace std;
int main() {
int yosh = 18;
int* ptr = &yosh;
cout << ptr;
return 0;
}
Bu dastur yosh o‘zgaruvchisining xotira manzilini chiqaradi.
Pointer orqali qiymatni olish¶
Pointerda * belgisi boshqa ma'noda ham ishlatiladi.
Masalan:
int yosh = 18;
int* ptr = &yosh;
cout << *ptr;
Natija:
18
Bu yerda *ptr pointer ko‘rsatayotgan o‘zgaruvchining qiymatini beradi.
& va * farqi¶
Bu ikkisini yaxshi tushunish muhim.
&:
o‘zgaruvchining manzilini oladi.
&yosh
*:
pointer orqali qiymatni oladi.
*ptr
Masalan:
int yosh = 18;
int* ptr = &yosh;
Bu yerda:
&yosh → yoshning manzili
ptr → yoshning manzili
*ptr → yoshning qiymati
Pointer orqali qiymatni o‘zgartirish¶
Pointer orqali o‘zgaruvchining qiymatini ham o‘zgartirish mumkin.
Masalan:
int yosh = 18;
int* ptr = &yosh;
*ptr = 20;
Endi:
cout << yosh;
Natija:
20
Ya'ni ptr orqali yosh qiymatini o‘zgartirdik.
Oddiy misol¶
#include <iostream>
using namespace std;
int main() {
int son = 10;
int* ptr = &son;
cout << "Son: " << son << endl;
cout << "Manzil: " << ptr << endl;
cout << "Pointer orqali: " << *ptr;
return 0;
}
Natija taxminan:
Son: 10
Manzil: 0x61ff08
Pointer orqali: 10
Manzil har xil bo‘lishi mumkin.
Pointer va massiv¶
Pointerlar massivlar bilan ham bog‘liq.
Masalan:
int sonlar[3] = {10, 20, 30};
Massiv nomi ko‘p holatlarda birinchi elementning manzilini bildiradi.
Masalan:
int* ptr = sonlar;
Endi:
cout << *ptr;
Natija:
10
Pointer orqali massiv elementlari¶
Masalan:
int sonlar[3] = {10, 20, 30};
int* ptr = sonlar;
cout << *ptr << endl;
cout << *(ptr + 1) << endl;
cout << *(ptr + 2) << endl;
Natija:
10
20
30
Bu mavzuni keyinchalik batafsilroq ko‘rish mumkin.
Hozircha pointer va massiv birga ishlatilishi mumkinligini bilib olish kifoya.
nullptr¶
Ba'zan pointer hech qanday manzilga ishora qilmasligi kerak.
Bunday holatda nullptr ishlatiladi.
Masalan:
int* ptr = nullptr;
Bu ptr hozircha hech narsani ko‘rsatmayapti degani.
nullptr nima uchun kerak?¶
Pointerga tasodifan noto‘g‘ri manzil berish xavfli bo‘lishi mumkin.
Shuning uchun kerak bo‘lmagan paytda:
int* ptr = nullptr;
deb yozish yaxshi odat.
Keyin pointerga kerakli manzil berish mumkin:
int son = 10;
ptr = &son;
Pointerga ehtiyot bo‘lish¶
Quyidagi kod xavfli:
int* ptr = nullptr;
cout << *ptr;
Chunki ptr hech narsani ko‘rsatmayapti.
Shuning uchun nullptr pointer orqali qiymat olishga urinmaslik kerak.
Funksiya va pointer¶
Pointerlar funksiyalarda ham ishlatiladi.
Masalan:
void ozgartir(int* son) {
*son = 100;
}
Keyin:
int x = 10;
ozgartir(&x);
cout << x;
Natija:
100
Bu yerda funksiya x ning manzilini oladi va uning qiymatini o‘zgartiradi.
Pointerlar nima uchun kerak?¶
Pointerlar C++ da ko‘p joyda ishlatiladi.
Masalan:
- xotira bilan ishlash;
- massivlar;
- funksiyalar;
- dinamik xotira;
- murakkab ma'lumot tuzilmalari.
Hozircha eng muhim tushuncha:
Pointer — boshqa o‘zgaruvchining xotira manzilini saqlaydi.
Oddiy tasavvur¶
Buni uy manzili bilan tasavvur qilish mumkin.
Masalan:
Ali → uy
Ali qayerda yashashini bilamiz:
Uy manzili → 25-uy
Pointer ham xuddi shunday.
yosh → 18
ptr → yoshning manzili
*ptr esa:
yoshning qiymati → 18
Amaliy mashqlar¶
1-mashq¶
int son = 10; yarating.
Uning xotira manzilini ekranga chiqaring.
2-mashq¶
Quyidagi o‘zgaruvchiga pointer yarating:
int son = 25;
Pointer orqali son qiymatini ekranga chiqaring.
3-mashq¶
Pointer orqali o‘zgaruvchi qiymatini o‘zgartiring.
Boshlang‘ich qiymat:
10
Natijada:
50
bo‘lsin.
4-mashq¶
Uchta elementli massiv yarating:
10, 20, 30
Pointer yordamida elementlarni ekranga chiqaring.
5-mashq¶
Quyidagi kod natijasini toping:
int x = 10;
int* ptr = &x;
*ptr = 20;
cout << x;
Muhim narsalarni eslab qoling¶
Pointer — xotira manzilini saqlaydigan o‘zgaruvchi.
Pointer yaratish:
int* ptr;
O‘zgaruvchining manzilini olish:
&son
Pointerga manzil berish:
int* ptr = &son;
Pointer orqali qiymatni olish:
*ptr
Pointer orqali qiymatni o‘zgartirish:
*ptr = 20;
Hech narsani ko‘rsatmaydigan pointer:
int* ptr = nullptr;
Pointerlar C++ ning kuchli imkoniyatlaridan biridir. Ularni tushunish keyingi mavzularda, ayniqsa xotira va dinamik ma'lumotlar bilan ishlashda juda foydali bo‘ladi.