Ҳаволалар билан ишлашда адрес операторининг(&) қўлланилиши.
Агарда ҳаволанинг адресини олмоқчи бўлсак, у ўзининг адресати адресини қайтаради. Ҳавола ўзига хос табиати айнан шу ҳолатдир. Ҳаволалар ўзларининг адресатларининг псевдонимлари ҳисобланадилар. Яъни улар адресатлари билан бир хил адресга эгадирлар. Ҳаволаларнинг бу хоссаси 9.2 – листингда намойиш қилинган.
9.2 – листинг. Ҳаволанинг адресини олиш.
// 9. 2. – листинг.
// Ҳаволаларни ишлатишга мисол.
# include < iostream.h>
int main( )
{
int intOne;
int &rSomeRef = intOne;
int One = 5;
cout << “ intOne:” << intOne << endl;
cout <<“& intOne:”<< & intOne<< endl;
cout<< “& rSomeRef:”<< &rSomeRef << endl;
return 0;
}
НАТИЖА:
intOne : 5
rSomeRef : 5
& intOne : 0 X 3500
& rSomeRef: 0 X 3500
ТАҲЛИЛ
Бу ҳолатда ҳам rSomeRef ҳаволага intOne ўзгарувчи ўзлаштирилди. Дастурда rSomeRef ҳаволаси intOne ўзгарувчисининг адреси чиқарилди ва улар бир хил эканлиги аниқланди. С++ тилида ҳаволани адресини олиш операцияси қараб чиқилмаган, чунки бу мантиққа мос келмайди. Ҳаволалар тузилиши билан уларга қиймат ўзлаштирилади ва улар ҳақиқатан ҳам ўз адресатларининг синоними бўлиб қоладилар. Адрес оператори буни тасдиқлаб турибди.
Ҳаволаларга қайта қиймат ўзлаштирилмайди.
Ҳаволалар ўзларининг адресатларининг псевдоними бўлганликлари сабабли уларга қайта қиймат ўзлаштириш мумкин эмас. Агарда бундай ҳол рўй берса, ҳавола мурожаат қилиб турган адресатга ҳам янги қиймат ўзлаштирилади. 9.3- листингда бу ҳолат намойиш қилинган.
9.3. – листинг. Ҳаволага қиймат ўзлаштириш
// 9.3. – Листинг.
// Ҳаволаларга қиймат ўзлаштириш
# include
int main()
{
int intOne;
int & rSomeRef = intone;
intOne = 5;
cout << “ intOne:\ t” << intOne << endl;
cout << “ rSomeRef :\ t”<< rSomeRef << endl;
cout << “& intOne:\ t” << & intOne << endl;
cout << “& rSomeRef:\t”<< & rSomeRef << endl;
int intTwo= 8;
rSomeRef = intTwo;
// Бу ерда сиз кутмаган амал бажарилди.
cout << “\n intOne: \ t” << intOne << endl ;
cout << “intTwo: \ t “ << intTwo << endl;
cout<<“rSomeRef :\t” << rSomeRef << endl;
cout<<“& intOne : \t” << & intOne << endl;
cout <<“& intTwo : \t” << &intTwo << endl;
cout <<“& rSomeRef: \t” <<& rSomeRef<< endl;
return 0;
}
HАТИЖА:
intOne : 5
rSomeRef : 5
&intOne : 0 * 213 e
&rSomeRef : 0 * 213 e
intOne : 8
intTwo : 8
rSomeRef : 8
&intOne : 0 * 213 e
&intTwo: 0 * 2130
&rSomeRef : 0 * 213 e
ТАҲЛИЛ
8 – ва 9 – сатрларда бутун сонли ўзгарувчи ва унга ҳавола эълон қилинди. 11–сатрда эса бутун сонли ўзгарувчига 5 қиймат ўзлаштирилди, 12 – 15 – сатрларда эса ўзгарувчи ва унга ҳаволанинг қиймати, ҳамда уларнинг адреслари экранга чиқарилди.
17 – сатрда intTwo номли янги ўзгарувчи тузилди ва унга 8 қиймат ўзлаштирилди. 18 – сатрда rSomeRef ҳаволага қайта қиймат ўзлаштиришга, яъни уни intTwo ўзгарувчисининг псевдонимига айлантиришга ҳаракат қилинди. Лекин биз кутган ҳол юз бермади. rSomeRef ҳавола олдингидек intOne ўзгарувчисининг псевдоними бўлиб қолаверди, 18 – сатрда бажарилган амал эса қуйидаги жумлага эвивалент бўлиб қолди холос.
intOne = intTwo
Бу 19 – ва 21 – сатрлар орқали уларнинг қийматини экранга чиқарилиши натижасида яна бир бор ўз тасдиғини топди: уларнинг қиймати intTwo ўзгарувчисининг қиймати билан устма – уст тушди. 23 – 25 – сатрлар орқали экранга чиқарилган маълумот эса rSomeRef ҳавола intTwo ўзгарувчисига эмас, балки ҳали ҳам intOne ўзгарувчисига мурожаат қилаётганлигини тасдиқлайди.
Do'stlaringiz bilan baham: |