C++ ko'rsatkichlar (Pointers)
C++ tilida ko‘rsatkichlar boshqa o‘zgaruvchilarning xotira manzillarini saqlaydigan o‘zgaruvchilardir.
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,
#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
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.
Ko'rsatkichlarni qanday e'lon qilishimiz mumkin:
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:
int* point_var; // afzal sintaksis
Ko'rsatkichlarga manzillarni qanday belgilashimiz mumkin:
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'rsatkich bilan ko'rsatilgan qiymatni olish uchun biz * operatoridan foydalanamiz. Masalan:
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 erdapoint_varo'zi ko'rsatgan o'zgaruvchining manzilini saqlaydigan ko'rsatkichdir,*point_varesa point_var ko'rsatgan manzilda saqlangan qiymatni qaytaradi.
#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
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

Agar point_var var manziliga ishora qilsa, biz *point_var dan foydalanib var qiymatini o'zgartirishimiz mumkin.
Masalan,
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.
#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
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.
Faraz qilaylik, point_var ko'rsatkichi var manziliga ishora qilishini xohlaymiz. Keyin,
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: