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:

ptrint 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.