# include int indeks = 3; int intArray[indeks][4] = {}; // hamma elementlar 0 ga tenglashtirildi void printArray(int mass[][4], int idx){ // funksiya e'loni for (int i = 0; i < idx; i++) { // massivning birinchi indeksini // o'zgartirsa bo'ladi for (int k = 0; k < 4; k++){ // massivning ikkinchi indeksi o'zgarmaydi cout << mass[i][k]; } cout << endl; } return; } ... int main() { ... printArray(intArray); // funksiya chaqirig'i ... return (0); } Massivning indekslarini funksiyaga bildirish yana muammoligicha qoladi.
Albatta, birinchi indeksdan tashqari qolgan boshqa indekslar kattaligini
funksiya ichida berish ma'noga egadir. Lekin birinchi indeks kattaligini
tashqaridan, qo'shimcha parametr sifatida bersak, funksiyamiz chiroyliroq
chiqadi, turli kattalikdagi massivlarni o'lish imkoniga ega bo'ladi.
5. POINTER (ko'rsatkich) VA SATRLAR C++ da ikki ko'rinishdagi ko'rsatkichlar - &-ko'rsatkichlar va pointerlar
mavjuddir. Aslida bularning farqi faqat qo'llanilishi va ko'rinishida desak
ham bo'ladi. Bu qismda biz C dan meros qolgan pointerlar bilan yaqindan
tanishamiz. &-ko'rsatkichlarni biz o'tgan qismda ko'rgan edik.
Pointerlar C/C++ dasturlash tillarining eng kuchli qurollaridandir. Lekin
pointer tushunchasini anglash ham oson emas. Pointerlar yordamida
funksiyalarning ko'rsatkich bo'yicha chaqirish mehanizmini amalga oshirish
mumkin. Undan tashqari pointerlar yordamida dinamik strukturalar - stek
(stack), ro'yhat (list), navbat (queue) va darahtlar (tree) tuzish mumkin.
Undan tashqari pointer, satr va massivlar orasida yaqin aloqa bordir. Satr
va massivlarni pointerlar yordamida berish bizga C dan meros bo'lob qoldi.
Keyingi boblarda biz satr va massivlarni to'la qonli ob'ekt sifatida qo'lga
olamiz.
Pointerlar qiymat sifatida hotira adreslarini oladilar. Oddiy o'zgaruvchilar
ma'lum bir qiymatga ega bo'lgan bir paytda, pointerlar boshqa bir
o'zgaruvchining adresini o'z ichlariga oladilar. Shunda o'zgaruvchi bevosita
qiymatga ko'rsatib tursa, pointer qiymatga bilvosita ko'rsatadi.
Pointer e'lonida, pointer ismidan oldin '*' (yulduzcha, ko'paytiruv) belgisi
qo'yilishi kerak. Misolda ko'raylik:
char *charPtr, c = 8, *pc, ff[] = "IcyCool";
Bu yerda charPtr va pc lar char tipidagi ko'rsatkichlardir. Yani, charPtr ni
"char tipidagi oz'garuvchiga ga ko'rsatkich" deb o'qisak bo'ladi. Ko'rsatkich
sifatida e'lon qilinayatgan har bir o'zgaruvchi ismi oldida '*' bo'lishi
shartdir.
Pointerlarni boshqa o'zgaruvchilar kabi e'lon davrida, yoki dastur ichida
qiymat berish yordamida initsalizatsiya qilish mumkin. Pointerlar qiymat
sifatida faqat o'zgaruvchi yoki ob'ektlarning adreslarini va NULL yoki 0 ni
oladilar. NULL simvolik konstantasi va boshqa bir necha standart
e'lon fayllarida aniqlangan. Pointerga NULL qiymatini berish pointerni 0 ga
tenglashtirish bilan tengdir, ammo C++ pointerga to'g'ridan-to'g'ri 0
qiymatini berish afzalroqdir, chunki agar NULL emas, 0 qiymati berilsa,
ushbu qiymat avtomatik ravishda pointerning tipiga keltiriladi. Butun
sonlardan faqat 0 qiymati pointerga keltirilishsiz berilishi mumkin. Agar
ma'lum bir hotira adresini pointerga bermoqchi bo'lsak, quyidagicha yozishimiz
mumkin:
int *iPtr, address = 0x45ad7 ;
iPtr = (int *) address; // C uslubida tiplarni keltirish
iPtr = static_cast(address); // C++ " " "
Lekin, albatta, yuqoridagi yozganimizni kamdam-kam qo'llashga to'g'ri
kelsa kerak, chunki adres olishning soddaroq yo'llari bordir. Aslida, pointer
e'lon qilinsa-yu lekin hali qo'llanilmayatgan bo'lsa, unga 0 qiymatini berish
tavsiya etiladi. Chunki, agar biz bu 0 qiymatli pointerni bilmasdan
qo'llamoqchi bo'lsak, kompilyator hato beradi, bunga sabab odatda operatsiyon
sistemalar 0 adresli hotira maydoni bilan ishlashga ruhsat bermaydilar. Shu
tariqa qiymatsiz pointer qo'llanilganidan ogoh bo'lamiz.