30 / 90

C++ Pointers

C++ ko'rsatkichlar (Pointers)

C++ tilida ko‘rsatkichlar boshqa o‘zgaruvchilarning xotira manzillarini saqlaydigan o‘zgaruvchilardir.

C++ da manzil

Biz dasturimizda e'lon qilgan har bir variable xotirada bog'langan joylashuvga ega bo'lib, biz uni o'zgaruvchining xotira manzili deb ataymiz.

Agar dasturimizda var o'zgaruvchisi bo'lsa, &var uning xotira manzilini qaytaradi. Masalan,

example.cpp
#include <iostream>
using namespace std;

int main()
{
    // o'zgaruvchilarni e'lon qilish
    int var1 = 3;
    int var2 = 24;
    int var3 = 17;

    // var1 ning chop etish manzili
    cout << "Address of var1: "<< &var1 << endl;

    // var2 ning chop etish manzili
    cout << "Address of var2: " << &var2 << endl;

    // var3 ning chop etish manzili
    cout << "Address of var3: " << &var3 << endl;
}

Chiqish

kod
Address of var1: 0x7fff5fbff8ac
Address of var2: 0x7fff5fbff8a8
Address of var3: 0x7fff5fbff8a4

Bu erda 0x boshida manzilni o'n oltilik shaklda ifodalaydi.

E'tibor bering, birinchi manzil ikkinchisidan 4 baytga, ikkinchi manzil uchinchidan 4 baytga farq qiladi.

Farqi shundaki, int hajmi 64 bitli tizimda 4 baytni tashkil qiladi.

[!NOTE] Dasturni ishga tushirganingizda bir xil natijalarga erisha olmaysiz. Buning sababi shundaki, manzil dastur ishlaydigan muhitga bog'liq.

C++ ko'rsatkichlari

Ko'rsatkichlarni qanday e'lon qilishimiz mumkin:

example.cpp
int *point_var;

Bu erda biz int ga ko'rsatuvchi bo'lgan point_var o'zgaruvchisini e'lon qildik.

Shuningdek, ko'rsatkichlarni quyidagi tarzda e'lon qilishimiz mumkin:

example.cpp
int* point_var; // afzal sintaksis

Ko'rsatkichlarga manzillarni belgilash

Ko'rsatkichlarga manzillarni qanday belgilashimiz mumkin:

example.cpp
int var = 5;
int* point_var = &var;

Bu erda 5 var o'zgaruvchisiga tayinlangan. Var manzili point_var = &var kodi bilan point_var ko'rsatkichiga tayinlangan.

[!NOTE] Ko'rsatkichlarni e'lon qilingan zahoti ishga tushirish yaxshi amaliyotdir.

Ko'rsatkichlar yordamida manzildan qiymatni oling

Ko'rsatkich bilan ko'rsatilgan qiymatni olish uchun biz * operatoridan foydalanamiz. Masalan:

example.cpp
int var = 5;

// var manzilini point_var ga tayinlang
int* point_var = &var;

// point_var tomonidan ko'rsatilgan kirish qiymati
cout << *point_var << endl;   // Chiqish: 5

Yuqoridagi kodda var manzili point_var ga tayinlangan. Biz ushbu manzilda saqlangan qiymatni olish uchun *point_var dan foydalandik.

* ko'rsatkichlar bilan ishlatilsa, u yo'qotish operatori deb ataladi. U ko'rsatgichda ishlaydi va ko'rsatgichda saqlangan manzil tomonidan ko'rsatilgan qiymatni beradi. Ya'ni, *point_var = var .

[!NOTE] C++ da point_var va *point_var butunlay boshqacha. *point_var = &var; kabi biror narsa qila olmaymiz. Bu erda point_var o'zi ko'rsatgan o'zgaruvchining manzilini saqlaydigan ko'rsatkichdir, *point_var esa point_var ko'rsatgan manzilda saqlangan qiymatni qaytaradi.

1-misol: C++ ko'rsatkichlari bilan ishlash

example.cpp
#include <iostream>
using namespace std;
int main() {
    int var = 5;

    // do'kon manzili var
    int* point_var = &var;

    // var ning chop etish qiymati
    cout << "var = " << var << endl;

    // varning chop etish manzili
    cout << "Address of var (&var) = " << &var << endl
         << endl;

    // bosma ko'rsatkich point_var
    cout << "point_var = " << point_var << endl;

    // point_var nuqtalari manzilining mazmunini chop eting
    cout << "Content of the address pointed to by point_var (*point_var) = " << *point_var << endl;
    
    return 0;
}

Chiqish

kod
var = 5
Address of var (&var) = 0x61ff08

point_var = 0x61ff08
Content of the address pointed to by point_var (*point_var) = 5

Working of C++ pointers

Working of C++ Pointers

Ko'rsatkichlar tomonidan ko'rsatilgan qiymatni o'zgartirish

Agar point_var var manziliga ishora qilsa, biz *point_var dan foydalanib var qiymatini o'zgartirishimiz mumkin.

Masalan,

example.cpp
int var = 5;
int* point_var = &var;

// point_var manzilidagi qiymatni o'zgartirish
*point_var = 1;

cout << var << endl; // Chiqish: 1

Bu yerda point_var va &var bir xil manzilga ega; *point_var o'zgartirilganda var qiymati ham o'zgaradi.

2-misol: Ko'rsatkichlar bilan ko'rsatilgan qiymatni o'zgartirish

example.cpp
#include <iostream>
using namespace std;
int main() {
    int var = 5;

    // do'kon manzili var
    int* point_var = &var;

    // chop var
    cout << "var = " << var << endl;

    // *point_var ni chop eting
    cout << "*point_var = " << *point_var << endl
         << endl;

    cout << "Changing value of var to 7:" << endl;

    // var qiymatini 7 ga o'zgartiring
    var = 7;

    // chop var
    cout << "var = " << var << endl;

    // *point_var ni chop eting
    cout << "*point_var = " << *point_var << endl
         << endl;

    cout << "Changing value of *point_var to 16:" << endl;

    // var qiymatini 16 ga o'zgartiring
    *point_var = 16;

    // chop var
    cout << "var = " << var << endl;

    // *point_var ni chop eting
    cout << "*point_var = " << *point_var << endl;
    return 0;
}

Chiqish

kod
var = 5
*point_var = 5

Changing value of var to 7:
var = 7
*point_var = 7

Changing value of *point_var to 16:
var = 16
*point_var = 16

Bu yerda point_var var manzilini saqlaydi va *point_var bilan point_var havolasini olib tashlash orqali biz ushbu manzilda saqlangan qiymatga kirishimiz va o'zgartirishimiz mumkin, bu esa o'z navbatida asl var o'zgaruvchisiga ta'sir qiladi.

Ko'rsatkichlar bilan ishlashda keng tarqalgan xatolar

Faraz qilaylik, point_var ko'rsatkichi var manziliga ishora qilishini xohlaymiz. Keyin,

example.cpp
int var = 5;

// Noto'g'ri!
// point_var - bu manzil, lekin var emas
int* point_var = var;

// Noto'g'ri!
// &var - bu manzil
// *point_var - &var ichida saqlangan qiymat
*point_var = &var;

// To'g'ri!
// point_var manzil va &var
point_var = &var;

 // To'g'ri!
// *point_var va var ikkala qiymatdir
*point_var = var;

Shuningdek o'qing: