31 / 90

C++ Pointers and Arrays

C++ ko'rsatkichlar va massivlar

C++ tilida Pointers variables bo'lib, u boshqa o'zgaruvchilarning manzillarini saqlaydi. Ko'rsatkich nafaqat bitta o'zgaruvchining manzilini, balki array katakchalari manzilini ham saqlashi mumkin.

Ushbu misolni ko'rib chiqing:

example.cpp
int *ptr;
int arr[5];

// birinchisining manzilini saqlang
// ptrdagi arr elementi
ptr = arr;

Bu erda ptr ko'rsatkich o'zgaruvchisi, arr esa int massividir. ptr = arr; kodi massivning birinchi elementi manzilini ptr o'zgaruvchisida saqlaydi.

E'tibor bering, biz &arr[0] o'rniga arr dan foydalanganmiz. Buning sababi, ikkalasi ham bir xil. Shunday qilib, quyidagi kod yuqoridagi kod bilan bir xil.

example.cpp
int *ptr;
int arr[5];
ptr = &arr[0];

Massivning qolgan elementlari uchun manzillar &arr[1] , &arr[2] , &arr[3] va &arr[4] tomonidan berilgan.

Har bir massiv elementiga ishora

Aytaylik, bir xil ptr ko'rsatkichidan foydalanib, massivning to'rtinchi elementiga ishora qilishimiz kerak.

Bu erda, agar ptr yuqoridagi misoldagi birinchi elementga ishora qilsa, ptr + 3 to'rtinchi elementga ishora qiladi. Masalan,

example.cpp
int *ptr;
int arr[5];
ptr = arr;

ptr + 1 is equivalent to &arr[1];
ptr + 2 is equivalent to &arr[2];
ptr + 3 is equivalent to &arr[3];
ptr + 4 is equivalent to &arr[4];

Xuddi shunday, biz bitta ko'rsatkich yordamida elementlarga kira olamiz. Masalan,

example.cpp
// dereference operatoridan foydalaning
*ptr == arr[0];
*(ptr + 1) is equivalent to arr[1];
*(ptr + 2) is equivalent to arr[2];
*(ptr + 3) is equivalent to arr[3];
*(ptr + 4) is equivalent to arr[4];

Aytaylik, agar biz ptr = &arr[2]; -ni ishga tushirgan bo'lsak

example.cpp
ptr - 2 is equivalent to &arr[0];
ptr - 1 is equivalent to &arr[1]; 
ptr + 1 is equivalent to &arr[3];
ptr + 2 is equivalent to &arr[4];

Working of C++ Pointers with Arrays

Working of C++ Pointers with Arrays

[!NOTE] Ptr va ptr + 1 orasidagi manzil 4 baytga farq qiladi. Buning sababi, ptr int ma'lumotlariga ko'rsatgichdir. Va 64 bitli operatsion tizimda int hajmi 4 baytni tashkil qiladi. Xuddi shunday, agar ptr ko'rsatkichi char tipidagi ma'lumotlarga ishora qilsa, ptr va ptr + 1 o'rtasidagi manzil 1 baytga teng. Buning sababi, belgi hajmi 1 bayt.

1-misol: C++ ko'rsatkichlari va massivlari

example.cpp
// Massivning har bir elementining manzilini ko'rsatish uchun C++ dasturi

#include <iostream>
using namespace std;

int main()
{
    float arr[3];

    // ko'rsatkich o'zgaruvchisini e'lon qilish
    float *ptr;
    
    cout << "Displaying address using arrays: " << endl;

    // massivning barcha manzillarini chop etish uchun for loop dan import
    for (int i = 0; i < 3; ++i)
    {
        cout << "&arr[" << i << "] = " << &arr[i] << endl;
    }

    // ptr = &arr[0]
    ptr = arr;

    cout<<"\nDisplaying address using pointers: "<< endl;

    // massivning barcha manzillarini chop etish uchun for loop dan import
    // ko'rsatkich belgilaridan foydalanish
    for (int i = 0; i < 3; ++i)
    {
        cout << "ptr + " << i << " = "<< ptr + i << endl;
    }

    return 0;
}

Chiqish

kod
Displaying address using arrays: 
&arr[0] = 0x61fef0
&arr[1] = 0x61fef4
&arr[2] = 0x61fef8

Displaying address using pointers: 
ptr + 0 = 0x61fef0
ptr + 1 = 0x61fef4
ptr + 2 = 0x61fef8

Yuqoridagi dasturda biz ptr ko'rsatkich o'zgaruvchisidan foydalanmasdan avval massiv elementlarining manzillarini oddiygina chop etdik.

Keyin, biz a[0] manzilini ko'rsatish uchun ptr ko'rsatkichidan, a[1] manzilini ko'rsatish uchun ptr + 1 va hokazolardan foydalandik.

Ko'pgina kontekstlarda massiv nomlari ko'rsatkichlarga aylanadi. Oddiy so'zlar bilan aytganda, massiv nomlari ko'rsatkichlarga aylantiriladi. Shuning uchun biz massivlar elementlariga kirish uchun ko'rsatgichlardan foydalanishimiz mumkin.

Biroq, shuni yodda tutishimiz kerakki, ko'rsatkichlar va massivlar bir xil emas.

Massiv nomlari ko'rsatkichlarga aylanmaydigan bir necha holatlar mavjud. Qo'shimcha ma'lumot olish uchun tashrif buyuring: When does array name doesn't decay into a pointer?

2-misol: Massiv nomi ko‘rsatgich sifatida ishlatiladi

example.cpp
// C++ Koʻrsatkich belgisi yordamida kiritilgan maʼlumotlarni kiritish va koʻrsatish dasturi.

#include <iostream>
using namespace std;

int main() {
    float arr[5];
    
   // Ko'rsatkich belgisi yordamida ma'lumotlarni kiriting
    cout << "Enter 5 numbers: ";
    for (int i = 0; i < 5; ++i) {

        // kiritilgan raqamni arr[i] da saqlash
        cin >> *(arr + i) ;

    }

    // Ko'rsatkich belgisi yordamida ma'lumotlarni ko'rsatish
    cout << "Displaying data: " << endl;
    for (int i = 0; i < 5; ++i) {

        // arr[i] ning ekran qiymati
        cout << *(arr + i) << endl ;

    }

    return 0;
}

Chiqish

kod
Enter 5 numbers: 2.5
3.5
4.5
5
2
Displaying data: 
2.5
3.5
4.5
5
2

Bu yerga,

  1. Biz birinchi navbatda foydalanuvchi kiritgan raqamlarni massivga saqlash uchun ko'rsatkich belgisidan foydalandik. cin >> *(arr + i) ; Bu kod quyidagi kodga teng: cin >> arr[i]; E'tibor bering, biz alohida ko'rsatkich o'zgaruvchisini e'lon qilmaganmiz, aksincha biz ko'rsatkich belgisi uchun arr massiv nomidan foydalanmoqdamiz. Bizga ma'lumki, arr massiv nomi massivning birinchi elementiga ishora qiladi. Shunday qilib, biz arrni ko'rsatkich vazifasini bajaradi deb o'ylashimiz mumkin. 2.Xuddi shunday, biz for siklidan arr qiymatlarini ko'rsatkich belgisi yordamida ko'rsatish uchun foydalandik. cout << *(arr + i) << endl ; Bu kod ga teng cout << arr[i] << endl ;