Oxirgi indeks eng tez o'zgaradi, ya’ni ko'p o'lchovli massivlar kompyuter xotirasiga birin-ketin ketma-ket joylashtiriladi.
Ko'p o'lchovli massivlar bilan ishlash xususiyatlarini ikki o'lchovli massiv misolida ko'rib chiqamiz.
Ikki o'lchovli massiv quyidagicha e'lon qilingan bo’lsin:
int а[3][4];
a[3][4] ikki o‘lchovli massivi kompilyator tomonidan uchta ko‘rsatkichli massiv sifatida ko‘riladi, ularning har biri 4 o‘lchamli bir o‘lchovli massivning boshiga o‘rnatiladi.
a massivning xotirada joylashuv sxemasi:
Ko’rsatgichlar
а [0]
а[0][0]
а[0][1]
а[0][2]
а[0][3]
а [1]
а[1][0]
а[1][1]
а[1][2]
а[1][3]
а [2]
а[2][0]
а[2][1]
а[2][2]
а[2][3]
Ushbu holatda, a[1] ko'rsatkichi a[0] + 4*sizeof (int) ga teng adresga ega, ya'ni keyingi satrning har bir birinchi elementi oldingi qatorning oxirgi elementidan keyin keladi.
Qiymatlar
Indekslash amalidan foydalanib massiv a[i][j] elementiga murojaat qilish *(*(a + i) + j) adresli arifmetikasi qo’llanilgan ekvivalent ifodaga mos keladi.
Xuddi shunday, o'lchamlarning ixtiyoriy miqdoriga ega ko'rsatkichlar va massivlar orasidagi mosliklarni o'rnatish mumkin.
↓ a[0]
↓ a[1]
↓ a[2]
a[0][0]
…
a[0][3]
a[1][0]
…
a[1][3]
a[2][0]
…
a[2][3]
a massiv xotirada ketma-ket ajratilgan sohalarda joylashadi:
Dinamik massivlar
Dinamik massivlar bilan ishlash statik massivlardagi kabi dasturni qayta ishlash bosqichida amalga oshirilmaydigan, balki dastur talabiga binoan bajarilishi davomida ularni yaratish va o‘chirish amallari bilan bog'liq;
Dinamik massivlarni e'lon qilish uchun ko'rsatkichlar ishlatiladi.
C tilida xotirani bo‘shatish va ajratish kutubxona funksiyalari (calloc, malloc, free) yordamida amalga oshiriladi.
C++ tilida xotirani bo‘shatish va ajratish uchun oddiyroq mexanizm - new va delete amallari qo'llaniladi.
Bu amallarni sodda misollarda ko’rib chiqamiz:
1) type *p = new type (Qiymat);
– sizeof(type) hajmli xotira sohasini unga ko'rsatgichni o'rnatish va ushbu sohaga ko’rsatilgan Qiymatni yozish orqali ajratish; misol uchun:
int *p = new int(5); mos keladi int *p = new int;
*p = 5;
Ajratilgan xotirani bo’shatish
delete p;
2) type *p = new type [n];
– n ta ketma-ket joylashadigan ob'ektlar uchun xotira ajratish, bunda ko'rsatgich n*sizeof(type) o'lchamdagi operativ xotira soha boshini qaytaradi; bu massiv yaratish uchun foydalaniladi;
Bu holatda barcha ajratilgan xotirani bo’shatish quyidagicha bo’ladi:
delete [ ] p;
new amal natijasi - belgilangan turdagi va miqdordagi ma'lumotlarni joylashtirish uchun ajratilgan xotira sohasining boshi adresini beradi; agarda xatolik yuzaga kelsa (masalan, xotira etarli bo'lmaganda), natija NULL bo'ladi.
Bundan tashqari, delete (uchirish) amali ko'rsatilgan adresda joylashgan qiymatlarni yo'q qilmaydi, lekin kompilyatorga ilgari band xotiradan foydalanishga imkon beradi. Ammo bu qiymatlardan foydalanishga urinish kutilmagan natijalarga olib kelishi mumkin.
Massiv band qilgan xotirani bo'shatishda delete amalidagi kvadrat qavslar majburiy hisoblanadi. Ularning bo’lmasligi ham kutilmagan natijalarga olib kelishi mumkin.
Bir o’lchovli dinamik massivlarni yaratish
n o'lchamli x haqiqiy bir o’lchovli dinamik massiv bilan ishlash va uni joylashtirishda yetarli xotira mavjudligini tekshirish uchun zarur bo'lgan dasturiy kodni qismi:
double *x; - Massiv uchun ko’rsatgichni e’lon qilish
int i, n;
cout << " Size = : "; - Dastur bajarilish davomida
n = 3, m = 4 uchun a massivga xotiradan joy ajratish sxemasi:
1) Satrga 3 ta ko’rsatgich uchun xotiradan joy ajratish, ya’ni ko’rsatgichlardan iborat bir o’lchovli massiv yaratiladi:
a
→
a[0]
a[1]
a[2]
↓
↓
↓
a[0][0]
a[1][0]
a[2][0]
. . .
. . .
. . .
a[0][3]
a[1][3]
a[2][3]
2) Satrning har bir ko'rsatkichi elementlar uchun ajratilgan xotira sohasi o'rnatiladi
Masala: dinamik ikki o’lchovli massiv yarating, uning minimal elementini hamda har bir satrning minimal elementlarini topish.
E’lon quyidagi ko’rinishda bo’ladi
int **а, n, m, i, j, va boshqalar …;
**a – dinamik ikki o’lchovli massivni yaratish uchun ko’rsatgichga ko’rsatgich, i, j – satr va ustunlarning joriy indekslari, n – satrlarning miqdori, m – ustunlarning miqdori (o’lchamlar klaviaturadan kiritiladi).