Сайфиев ж. Ф. С++ тилига кириш услубий қўлланма


Нол кўрсатгичлар ва ҳаволалар


Download 3.45 Mb.
bet72/79
Sana18.10.2023
Hajmi3.45 Mb.
#1707139
1   ...   68   69   70   71   72   73   74   75   ...   79
Bog'liq
cpp buxoro

Нол кўрсатгичлар ва ҳаволалар.


Агарда кўрсаткичга қиймат ўзлаштирилмаган ёки у бўшатилган бўлса унга нол қиймат (0) бериш лозим. Бу ҳолат ҳаволаларга (ссылкаларга) тегишли эмас. Умуман, ҳаволалар нол бўлмаслиги лозим ва нол объектларга ҳаволаларни сақловчи дастур нокоррект ҳисобланади. Нокоррект дастурнинг ишлаш жараёнида турли хатолик пайдо бўлиши мумкин.


Функцияга аргументларни ҳавола кўринишда узатилиши.


5 – мавзуда функциялардаги иккита камчилик, уларга аргументларни қиймат сифатида узатилишида аргумент қилиб узатилган объект билан узатилаётган ўзгарувчиси орасида алоқани узилиши (уларни алоҳида – алоҳида объект деб эътироф этилиши) ҳамда функцияларни фақатгина битта қиймат қайтариши билан танишган эдик.


Бу иккала чеклашни функцияга аргументларни ҳавола кўринишда узатиш орқали ҳал қилиш мумкин. С++ тилида функцияга аргументларни ҳавола кўринишида узатишда икки усулдан фойдаланилади. Улар ёки кўрсаткичлар ёрдамида, ёки ҳаволалар ёрдамида узатилади.
Кўрсатгичнинг қўлланилиш синтаксиси ҳаволанинг ишлатилиш синтаксисидан фарқ қилишига қарамай улар ёрдамида бир хил иш бажарилади. Функцияга унинг кўриниш соҳаси чегараси учун объектнинг нусхаси ўрнига унинг ўзи узатилади.
Биз 5 – мавзуда функцияга узатиладиган параметрлар хотира стекида жойлашиши билан танишган эдик. Агарда функцияга ҳавола кўринишида қиймат узатилса стекда объектнинг ўзи эмас балки унинг адреси жойлашади.
Кўпгина компютерларда адрес махсус регистрда сақланади. Ихтиёрий ҳолда компиляторни жорий объектга ҳавола қилиш, зарурат туғилганда уни ўзгартириш унинг нусхаси устида эмас, балки тўғридан – тўғри объектнинг ўзида бажарилади. Қуйидаги листингларда функцияга параметрларни қиймат ва ҳавола сифатида узатишнинг ўзига хос хусусиятлари билан танишамиз.
9.5. – листинг. Функцияга аргументни қиймат сифатида узатилиши
//9.5.–листинг. Параметрларни қиймат сифатида узатиш
# include < iostream.h>
void swap ( int x, int y);
int main( )
{
int x=5,y=10;
cout<<“Main. Before swap, x:”<cout<<“\n”;
swap(x,y);
cout<<“Main.After swap, x:”<cout<<“\n”;
return 0;
}
void swap ( int x, int y)
{
int temp;
cout << “ Swap. Before Swap, x :”<cout <temp = x;
x=y;
y=temp;
cout << “Swap. After Swap, x:” << x
cout << “y:”<}
НАТИЖА:
Main.Before Swap, x: 5 y: 10
Swap.Before Swap, x: 5 y: 10
Swap.After Swap, x: 10 y: 5
Main.After Swap, x: 5 y: 10
Бу программада main() функциясида иккита ўзгарувчига қиймат ўзлаштирилади, кейин эса улар swap() функциясига узатилади. swap() функцияси бу ўзгарувчиларнинг қийматларини алмаштиради. Лекин бу ўзгарувчилар main() функциясида қайта текширилганда улар ўзгармаганлиги аниқланади. Бу ерда муаммо нимадан иборат?
х ва у ўзгарувчилар swap() функциясига қиймат бўйича узатилди. Яъни бу ҳолатда бу ўзгарувчиларнинг локал нусхаси функция ичида ҳосил қилинади. swap() функцияси ичида амаллар ана шу ўзгарувчиларнинг нусхалари устида бажарилган. Функция ўз ишини тугатиши билан бу нусхалар учун ажратилган жой тозаланади, яъни ўзгарувчилар хотирадан ўчирилади. swap() функциясидан ташқарида эса х ва y ўзгарувчилари олдинги қийматларини сақлаб турган эди. Натижада x ва y ўзгарувчиларининг қийматларини swap() функцияси ишини тугатгандан кейин чиқарилишида х ва у ўзгарувчилар дастлабки қийматларини қайтардилар.
Функция ўз ишини тугатгандан кейин ҳам у томонидан ўзгартирилган объектлар ўз қийматларини сақлаб қолиш учун жорий объектларни функция параметрига ҳавола кўринишида узатиш лозим. С++ тилида бу масалани ечишни икки усули мавжуд: swap() функциясига параметрларни берилган қийматларга кўрсатгич қилиб узатиш ёки берилган қийматларга ҳаволани параметр сифатида узатиш лозим.

Download 3.45 Mb.

Do'stlaringiz bilan baham:
1   ...   68   69   70   71   72   73   74   75   ...   79




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling