C++ proqramlaşdırma dİlİ 19. 12. 2011


Ünvan dəyişənləri - Göstəricilər



Yüklə 0,74 Mb.
səhifə4/11
tarix17.11.2018
ölçüsü0,74 Mb.
#80411
növüNümunə proqram
1   2   3   4   5   6   7   8   9   10   11

$4 Ünvan dəyişənləri - Göstəricilər.

4.1 Dinamik və Adi dəyişənlər

Gələcəyin güclü proqramçıları ilə tələbələrin ayrıldığı yerə çatdıq.

Proqramda istifadə olunan dəyişənlər yaddaşda yer ayrılmasına görə iki cür olur: adi və

dinamik . Bizim indiyə qədər istifadə etdiyimiz dəyişənlər hamısı adi dəyişənlərdir. Aşağıda onların müqaisəsi verilir.



Adi dəyişənlər :

ancaq proqramın əvvəlində onlara yer ayrılır,proqramın icrası boyu onlara ayrılan yer olduğu kimi qalır və bu yer dəyişəndən geri alınıb hansısa başqa məqsəd üçün istifadə oluna bilməz, proqramın icrası boyu yaddaşda eyni bir ünvana istinad edirlər, bu dəyişənlərin istinad etdiyi ünvanı dəyişdirmək olmaz.



Dinamik dəyişənlər :

Dinamik dəyişənləri proqramın icrasının istənilən anında yaratmaq olar,onlara ayrılmış

yaddaş proqramın icrasının istənilən anında geri alıb həmin yeri istənilən digər məqsəd üçün istifadə etmək olar.Dinamik dəyişənlərin yaddaşda istinad etdikləri ünvanı istənilən digər ünvana dəyişdirmək olar, hətta digər proqramın və ya nüvənin yaddaş sahəsinə.Ancaq buna etmək istədiyimiz ilk cəhddə nüvə proqramımızı təmamilə söndürər(başqa proqramların məlumatlarına icazəsiz müraciət etmək olmaz).

Ünvan dəyişənlərinin özəlliyi odur ki, onlar özlərində məlumat olaraq bizim üçün əhəmiyyətli olan məlumatın ünvanın saxlayırlar. Əgər biz bu ünvanı dəyişsək onda onlar ayrı məlumata istinad edəcəklər. Bu C/C++ dillərinə xarakterik olan, proqramçıya yaddaşla istədiyi kimi manipulyasiya etmə imkanı yaradan güclü vasitələrdən biridir.

Proqramda hər hansı tipdən ünvan dəyişəni elan etmək üçün aşağıdakı sintaksisdən istifadə olunur:

tip *dəyişən;

Tam tipli hər-hansı ünvan dəyişəni elan edək:



int *x;

Göründüyü kimi bunun adi dəyişən elan etmək qaydasından ( int x; ) fərqi ancaq dəyişən

adının əvvəlində( *) - ulduz simvolunun olmasıdır.

Bu zaman yaddaşın vəziyyəti belədir(şəkil 5):

İndi mən x ünvan dəyişənini istənilən yaddaş ünvanına və ya istənilən dəyişənin yaddaş

sahəsinə mənimsədə bilərəm və ya yaddaşda dinamik şəkildə əlavə yer ayıra və həmin

yerə mənimsədə bilərəm. Misal üçün gəlin adi int tipli y dəyişəni elan edək( int y; ) və onun yaddaş sahəsinə 5 qiyməti yazaq:( y = 5; ).

Yaddaşın vəziyyəti:

İndi mən x -i y -in yaddaş sahəsinə mənimsədə bilərəm.

Bunun üçün (&)ünvan operatorundan istifadə edəcəm.



(&) opratoru istənilən dəyişənin və funksiyanın ünvanını almaq üçün istifadə olunur.

x -i y -in ünvanına məminsətmək üçün sadəcə olaraq yazırıq:



x = &y ;

Yaddaşın vəziyyəti:

Əgər bizə ünvan dəyişəninin istinad etdiyi ünvana müraciət etmək lazımdırsa onda sadəcə ünvan dəyişəninin adından istifadə edirik. Əgər biz həmin ünvanda yerləşən məlumata müraciət etmək istəyiriksə bu zaman dəyişənin əvvəlinə elanda oluğu kimi * simvolu artırırıq.

Gəlin bu dediklərimizi proqram nümunəsində test edək.



//prg_4_1.cpp

#include

int main(int argc, char *argv[])

{ int *x;



// tam tipli unvan deyisheni

int y;


y=5;

x=&y; // & unvan operatorudur



// y -in qiymetini cap edek

std::cout<<"y-in qiymeti = "<

// x-in qiymetini cap edek (aha y-in unvani)

std::cout<<"\n x-in qiymeti (y-in unvani) "<

// x unvanında yerləşən məlumatı cap edək

std::cout<<" x-in istinad etdiyi melumat "<<*x;



// x-in istinad etdiyi məlumatı deyishek

*x=67;

// y -in qiymetini cap edek

std::cout<<"y-in yeni qiymeti = "<

return 0;

}

Proqramı icra edək:



C:\cpp\prog2\Debug>

C:\cpp\prog2\Debug>prog2.exe

y-in qiymeti = 5

x-in qiymeti (y-in unvani) 0x7fffb4cbe824

x-in istinad etdiyi melumat 5

y-in yeni qiymeti = 67

C:\cpp\prog2\Debug>

C:\cpp\prog2\Debug>

Burada x-in qiyməti olaraq 0x7fffb4cbe824 çap olunmuşdur. Ünvan ədədlə ifadə olunur və

adətən 16-lıq say sisteminə göstərilir(hex). Mövzudan kənar olduğuna görə biz fiziki yaddaşın strukturu və fiziki, virtual ünvanlar barəsində söhbət açmayacağıq.

* (çətinliyi artırılmış mövzudur, bu hissəni oxumadan 4.2 -yə keçə bilərsiniz)

Biz dedik ki, ünvan dəyişənlərinə hər hansı adi dəyişənin və ya funksiyanın ünvanını

mənimsətmək üçün & operatorundan istifadə olunur. Gəlin int tipindən olan x dəyişəni elan edək və ona proqramın icraya başlama ünvanını (main funksiyasının ünvanını) mənimsədək və bu ünvanı çap edək.

#include

int main(int argc, char *argv[])

{ int *x;

x = &main;

std::cout<
return 0;

}

İcra edək:



C:\cpp\prog2\Debug>

C:\cpp\prog2\Debug>prog2.exe

0x4004c4

C:\cpp\prog2\Debug>

C:\cpp\prog2\Debug>

Başqa bir proqram tərtib edin və onun icraya başladığı ünvanı çap edin, eyni nəticə alacaqsınız. Sual: necə ola bilər ki, iki müxtəlif proqram yaddaşda eyni ünvandan icra olunmağa başlasın? - Cavab virtual yaddaş.



4.2 Dinamik yaradılma

Biz ünvan dəyişənlərinə qiymət mənimsədilməsi, həmin ünvanda yerləşən məlumata

müraciət ilə tanış olduq və qeyd elədik ki, ünvan dəyişənləri proqramın icrası zamanı dinamik yaradıla və yaddaşdan silinə bilər. Ünvan dəyişənləri üçün yaddaşda yer ayırmaq üçün new funksiyasından istifadə edirlər.

Sintaksisi aşağıdakı kimidir:



unvan_deyisheni = new tip;

Aşağıdakı kimi:



int x;

x = new int;

Bu zaman yaddaşın vəziyyəti belə olar:



4.3 Dinamik silinmə

Ünvan dəyişəni üçün ayrılan yaddaş sahəsini silmək üçün delete funksiyasından istifadə

edirlər.

Sintaksis belədir:



delete unvan_deyisheni;

Misal üçün :



delete x;

Yaddaşın vəziyyəti:

Biz demək olar ki, ünvan dəyişənlərlə bağlı bir çox əsas anlayışlarla tanış olduq.

İrəlidəki paraqraflarda biz bu biliklərimizi daha da möhkəmləndirəcəyik.

İndi isə proqram nümunələri ilə tanış olaq.

Bu proqramların hər biri üzərində ayrı-ayrılıqda işləmədən növbəti paraqrafa keçmək

məsləhət deyil.

Aşağıadkı proqramları icra edib yerinə yetirin və onların nə etdiyini izah edin.



//prg_4_2.cpp

#include

int main(int argc, char *argv[])

{ int x;


int *y;

// tam tipli unvan deyisheni

x=5;


std::cout<<"x-in qiymeti = <y=&x;


// & unvan operatorudur

*y=155;


std::cout<<"y-in istinad etdiyi qiymet = <<*y<<"\n";

// y x-in yaddshina unvanlandigindan(y=&x)

// *y i deyismek birbasha x-i deyishdirir.

std::cout<<"x-in qiymeti = <

return 0;

}

//prg_4_3.cpp

#include

int main(int argc, char *argv[])

{ int x;

int *y;


x=5;

y= new int; // dinamik yaradilma

*y=176;

std::cout<<"y-in istinad etdiyi qiymet = <<*y<<"\n";



delete y;

// y -e ayrilan yaddash sahesini y-den azad edir

// ve bu sahede olan butun melumat silinir

return 0;

}
4.4 Ünvan dəyişənlərinin qiymətlərinin dəyişdirilməsi

Biz qeyd etdik ki, ünvan dəyişənləri özlərində qiymət olaraq fiziki yaddaşın hansısa ünvanın saxlayır. Bu ünvanda hər-hansı məlumat və ya proqram kodu yerləşə bilər. Həm də biz qeyd elədik ki, ünvan dəyişənlərinin istinad etdikləri bu ünvanı yaddaşın istənilən başqa yerinə yönləndirə bilərik. Gəlin proqram kodlarında bütün bu dedikləmizlə əyani tanış olaq.

// prg_4_4.cpp

#include

int main()

{ int x,y,*z;

x=35;

y=68;


// x ve y-in qiymetlerini cap edek

std::cout<<" x-in ve y-in qiymetleri "<

// evvelce z -te x-in unvanin menimsedek

z=&x;


// bu unvanda olan melumati cap edek

std::cout<

// sonra z -te y-in unvanin menimsedek

z=&y;


// bu unvanda olan melumati cap edek

std::cout<

return 0;

}

Proqramı icra edək:



C:\cpp\prog2\Debug>

C:\cpp\prog2\Debug>prog2.exe

x-in ve y-in qiymetleri 35 , 68

0x7fff036b1d54 unvaninda olan melumat 35

0x7fff036b1d50 unvaninda olan melumat 68

C:\cpp\prog2\Debug>

C:\cpp\prog2\Debug>

İzahı:


Proqramda x y adlı iki adi dəyişən və z ünvan dəyişəni elan edirik. x y-ə qiymətlər

mənimsədirik. Daha sonra z-tə əvvəlcə x-in ünvanını məminsədirik və bu ünvanda yerləşən məlumatı çap edirik, daha sonra z-tə y-in ünvanını mənimsədirik. Gördüyümüz kimi ünvan dəyişənlərinin özlərinin qiymətlərini dəyişməklə yaddaşın müxtəlif ünvanlarına istinad etmək olar.



Çalışmalar

1. Ancaq ünvan dəyişənlərindən istifadə etməklə iki ədədin cəmini hesablayan proqram

tərtib edin.

2. Ancaq ünvan dəyişənlərindən istifadə etməklə iki ədədin maksimumunu hesablayan

proqram tərtib edin.


$5. FUNKSİYALAR
C++ dilinin proqramçılar arasında ən məşhur dil olmasında rol oynayan 2 ən güclü

imkanından biri funksiyalardır. Funksiyalar bizə proqramın istənilən yerindən digər hissəsinə (funksiyaya) müraciət etməyə imkan verir. Proqramda funksiyadan istifadə etmək üçün biz əvvəlcə funksiyanı elan etməliyik. Daha sonra isə funksiyanın proqram kodunu tərtib etməliyik.


5.1 Funksiyanın elanı

C++ dilində funksiya aşağıdakı kimi elan olunur:



Nəticənin_tipi funksiyanın_adı ( tip1 argument1, tip2 argument2, ...);

Burada nəticənin_tipi funksiyanın qaytaracağı nəticənin tipini göstərir.Əgər funksiya heç bir nəticə qaytarmırsa onda nəticənin_tipi olaraq void yazırıq.



funksiyanın_adı olaraq ingilis əlifbasının hərflərindən, rəqəmlərdən,( _) simvolundan istifadə edə bilərik. Funksiya adı mütləq ingilis əlifbası hərfi ilə başlamalıdır və operator adları ilə üstüstə düşməməlidir. Funksiyanın adından sonra mötərizə daxilində funksiyanın qəbul edəcəyi arqumentlərin siyahısı verilir. Arqumentlər bir-birindən vergüllə ayrılır. Arqumentlərin əsas tipi önəmlidir. Funksiyanın elanında arqumentlərə verilən adlar heç bir əhəmiyyət daşımır və onlar buraxıla bilər.

Aşağıdakı kimi:



Nəticənin_tipi funksiyanın_adı ( tip1 , tip2 , ...);

Nümunə:


int cem (int x, int y);

Burada biz int tipli nəticə qaytaran və int tipli iki arqument qəbul edən cem funksiyası elan elədik. Biz bunu aşağıdakı kimi də yaza bilərik:

harada ki arqumentlərin adları göstərilmir: int cem (int , int );

5.2 Funksiyanın mətn kodunun tərtibi

Funksiyanı elan etməklə biz kompilyatora funksiya (ad, tip, arqumentlər) barəsində məlumat veririk. Funksiyanın mətn kodunu tərtib etməklə biz onun görəcəyi işi proqramlaşdırmış oluruq. Bunun üçün aşağıdakı qaydadan istifadə edirik:



  1. Nəticənin_tipi funksiyanın_ad ( tip1 arg1, tip2 arg2) {

(2) proqram kodu

return nəticə;

}

Burada ilk sətir (1) funksiyanın elanı sətridir. Fərq yalnız odur ki, mötərizədən sonra (;) deyil ( {) simvolu gəlir.({ )simvolu funksiyanın proqram kodu blokunun başlanğıcını bildirir.

{ simvolundan sonra funksiyanın proqram kodu yerləşdirilir. Burada biz adi halda olduğu kimi istənilən proqram kodu yerləşdirə bilərik və hətta digər funksiyalara müraciət də edə bilərik.

Bundan əlavə biz funksiyanın öz kodu daxilində onun özünə müraciət də edə bilərik. Buna proqramlaşdırmada rekursiya deyirlər.

Gəlin yuxarıda elan etdiyimiz cem funksiyasının proqram kodunu tərtib edək:
int cem ( int x, int y)

{

int z;

z = x + y;

return z;

}

Burada funksiyanın daxilində int tipli z dəyişəni elan etdik. Daha sonra z dəyişəninə

funksiyanın arqumentlərinin (x y) cəmini mənimsətdik və alınmış qiyməti nəticə olaraq qaytardıq.

5.3 Return əmri, və funksiyadan geri qayıtma

Proqramda hər- hansı funksiyaya müraciət aşağıdakı şəkildəki kimi baş verir:

Proqram kodu icra olunur və hansısa yerdə funksiyaya müraciət olunur. Bu zaman proqramın hal-hazırda icra olunan instruksiyasının ünvanı yadda saxlanılır və icarolunma çağrılan funksiyanın kodu yerləşən hissəyə ötürülür. Funksiya öz işini yekunlaşdırdıqdan sonra isə icraolunma yenidən proqramın funksiya çağrılan yerinə qaytarılır(həmin yerin ünvanı yaddaşa yerləşdirilmişdi).

Funksiyanı çağırmaq üçün biz onun adından istifadə edirik(aşağıdakı proqram nümunəsinə bax).Bəs icraolunma funksiyadan onu çağıran kod hissəsinə geri necə ötürülür? Funksiyanı çağırmaq və ondan geri qayıtmaq üçün prosessorun call ret assembler instruksiyalarından istifadə olunur, lakin mən bu məsələdə çox dərinə getmək istəmirəm. Sadəcə olaraq onu bilməyimiz kifayətdir ki, funksiyanın daxilində istənilən yerdən geri qaytarmaq istəyiriksə (funksiyadan çıxmaq) return operatorundan istifadə edirik.

Funksiya daxilində return operatoru icra olunan yerdən sonra gələn hissələr yerinə

yetirilmir.Biz dedik ki, funksiyanın tipi ya hər hansı tip , yada void ola bilər(funksiya heç bir nəticə qaytarmır).Əgər funksiya icra olunduqdan sonra hər hansı nəticə qaytarmalıdırsa bu da return operatoru vastəsilə həyata keçirilir. Bu zaman funksiyanın qaytaracağı məlumatı return operatoruna arqument kimi vermək lazımdır.

Aşağıdakı kimi:

return netice;

5.4 Funksiyalardan istifadə

Biz funksiyaların elanı , mətn kodunun tərtibi və funksiyadan qayıtmanın qaydalarını

öyrəndik.İndi isə gəlin funksiyalardan istifadə olunan proqram nümunələri ilə tanış olaq.

Proqram nümunəsi:

Funksiyadan istifadə etməklə iki ədədin cəmini hesablayan proqram:



//prg_5_1.cpp

#include



/*cem finksiyanin elani */

int cem (int x, int y);

int main (int argc, char *argv[])

{

int x,y,z;



std::cout<<"x -i daxil edin \n";

std::cin>>x;

std::cout<<"y -i daxil edin \n";

std::cin>>y;



/* cem funksiyasin cagiririq */

z = cem(x,y);

std::cout<<"x ile y -in cemi = "<
return 0;

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



/* cem finksiyasinin kodu */

int cem ( int dey1, int dey2)

{ int dey3;

dey3 = dey1 + dey2;



return dey3;

}

Proqramı kompilyasiya edib yerinə yetirək:



C:\cpp\prog2\Debug>

C:\cpp\prog2\Debug>prog2.exe

x -i daxil edin 7

y -i daxil edin 789

x ile y -in cemi = 796

C:\cpp\prog2\Debug>

C:\cpp\prog2\Debug>

İzahı:

Baxdığımız proqramda əvvəlcə cem funksiyasının elanı sətri yerləşir, daha sonra isə

proqramın əsas funksiyası main funksiaysı gəlir. Burada istifadəçi x y dəyişənlərinin

qiymətlərini daxil edir. Daha sonra bu dəyişənlər cem funksiyasına ötürülür, cem funksiyası bu dəyişənlərin cəmini hesablayır və nəticəni qaytarır.


5.5 Lokal və Qlobal dəyişənlər

Funksiyalardan istifadə edərkən bilməli olduğumuz vacib anlayışlardan biri də lokal qlobal dəyişənlər anlayışıdır. Nədir lokal qlobal dəyişənlər? lokal qlobal dəyişən -nin nə olduğunu bilmək üçün biz blok anlayışını daxil etməliyik. C++ dilində { və } mötərəzələri arasında qalan hissə blok adlanır.

Əgər diqqət yetirsəniz, görərsiniz ki, funksiyanın mətn kodu bütövlükdə bir blok -dan ibarətdir.

blok daxilində blok elan edə bilərik və bu zaman "içəridə" yerləşən blok –lar "üst" blok –lardakı dəyişənləri görür, "üst" blok -lar isə "içəri" blok -larda elan olunan dəyişənləri görmür.

Aşağıdakı kimi:

{

/* blok A */

int x;


/* x y-i gormur*/

{

/* blok B */ int y;



/* y ise x-i gorur, ona gore yaza bilerem*/

y = x;


{

/* blok C */

int z;


/* z -ti ne blok A ne de blok B gormur.*/

/* z ise x ve y-i gorur, ona gore yaza bilerem*/

z = x + y;



/* blok C -nin sonu*/

}

/* blok B -nin sonu */

}

/* blok A -nin sonu */

}

Biraz əvvəl daxil etdiyimiz proqrama nəzər salsaq görərik ki, cem funksiyası daxilində biz int tipli dey3 dəyişəni elan etmişik. Aydındır ki, bu dəyişən main funksiyası üçün lokaldır , yəni biz main funksiyasından və ümumiyyətlə proqramın cem funksiyasından başqa heç bir yerindən dey3 -ə müraciət edə bilmərik.



5.6 Dəyişənlərin ünvana və Qiymətə görə ötürülməsi

Yuxarıda baxdığımız proqramda biz cem funksiyasına arqument olaraq int tipli iki dəyişən ötürdük. Funksiya bu dəyişənlərin cəmini hesablayıb nəticə olaraq qaytardı. Bu zaman biz dəyişənlərin funksiyaya qiymətə görə ötürülməsi qaydasından istifadə etdik. Bir çox hallarda isə bizə nəticə ilə yanaşı, funksiyanın ona ötürülən parametrlərin də qiymətlərini dəyişdirməsi tələb olunur.

Bu zaman isə biz dəyişənlərin funksiyaya ünvana görə ötürülməsi qaydasından istifadə

etməliyik.



Fərq nədədir?

Dəyişənlərin qiymətə görə ötürülməsi.

Dəyişəni qiymətə görə ötürəndə (indiyə kimi baxdığımız hal) , dəyişənlərin nüsxələri

(kopiya) yaradılır və funksiyaya bu nüsxələr ötürülür. Aydın məsələdir ki, bu zaman nüsxə üzərində aparılan heç bir əməliyyat dəyişənlərin orijinal qiymətlərinə təsir etmir. Bir tərəfdən bu yaxşıdır, çünki bu zaman biz dəyişənləri mühafizə etmiş oluruq. Amma pis cəhət odur ki, dəyişənlərin nüsxəsinin yaradılmasına həm əlavə vaxt, həm də yaddaşda əlavə yer ayrılır və iri həcmli dəyişənlər olanda bu qayda sərfəli olmur. Həm də əgər məsələnin tələbi ilə funksiya parametrlərinin qiymətlərinin dəyişdirilməsi lazım olsa qiymətə görə ötürmədə biz bunu edə bilmərik.

Dəyişənlərin ünvana görə ötürülməsi.

Ünvana görə ötürülmə zamanı isə funksiyaya ötürülən dəyişənlərin heç bir nüsxəsi

yaradılmır, funksiyaya dəyişənlərin yaddaşdakı ünvanları ötürülür.Bu zaman funksiya

daxilində dəyişən üzərində aparılan bütün əməlyyatlar funksiya bitdikdən sonra qüvvədə

qalır. Dəyişənləri ünvana görə ötьrmək üçün biz funksiyanı aşağıdakı kimi elan etməliyik:

Nəticənin_tipi funksiyanın_adı ( tip1 *arg1, tip2 *arg2, ...);

Dəyişənləri bu funksiyaya parametr kimi ötürəndə isə onların əvvəlinə ünvan - & operatoru əlavə etməliyik.

Nümunə:

Ünvana görə ötürülmə zamanı funksiyanın elanı:



int funk (int *, int *);

Funksiyaya müraciət:



int x,y;

funk(&x, &y);

Gəlin arqumentlərin funksiyaya qiymətə və ünvana görə ötürülməsinin fərqinə baxmaq üçün proqram tərtib edək.



// prg_5_2.cpp

#include

void funk1 (int);

void funk2 (int*);

int main(){

int x=45;

std::cout<<"x-in ilkin qiymeti "<

funk1(x);

std::cout<<"x-in funk1-den sonraki qiymeti "<

funk2(&x);

std::cout<<"x-in funk2-den sonraki qiymeti "<
return 0;

}

// qiymete gore oturulme

void funk1 (int x){

x=90;


std::cout<<"x-in funk1 daxilinde qiymeti "<}

// unvana gore oturulme

void funk2 (int *x){

*x=200;


std::cout<<"x-in funk2 daxilinde qiymeti "<<*x<<"\n";

}

Proqramı icra edək:



C:\cpp\prog2\Debug>

C:\cpp\prog2\Debug>prog2.exe

x-in ilkin qiymeti 45

x-in funk1 daxilinde qiymeti 90

x-in funk1-den sonraki qiymeti 45

x-in funk2 daxilinde qiymeti 200

x-in funk2-den sonraki qiymeti 200

C:\cpp\prog2\Debug>

C:\cpp\prog2\Debug>

İzahı:


funk1 -də arqument funksiyaya qiymətə görə, funk2-də isə ünvana görə ötürülür. Başqa

sözlə funk1 -də arqumentin nüsxəsi yaradılır və funksiyaya nüsxə ötülür, funk2 -də

isəarqumentin ünvanı funksiyaya ötürülür. funk1 daxilində ona ötürülən dəyişən üzərində aparılan bütün dəyişikliklər funksiya qayıtdıqdan sonra itir. funk2 -də bütün dəyişikliklər birbaşa dəyişənə aid yaddaş sahəsi üzərində aparıldığından funksiya qaytdıqdan sonra ona

ötьrьlən parametr ьzərində aparılmış bьtьn dəyişikliklər qalır.



*5.7 Ünvan Dəyişənlərinin Funksiyaya Ünvana və Qiymətə görə

ötürülməsi

(*Çətinliyi artırılmış mövzudur)Biz adi dəyişənlərin funksiyaya qiymətə və ünvana görə

ötürülməsi ilə tanış olduq. İndi isə gəlin ünvan dəyişənlərinin funksiyaya parametr kimi

ötürülməsi və bu zaman qiymətə və ünvana görə ötürülmənin fərqi ilə tanış olaq.



// prg_5_3.cpp

#include

void funk1(int *);

void funk2(int **);

int x,y,*z;

int main(){

x=35;

y=68;


std::cout<<"x-in ve y -in qiymetleri "<
<

std::cout<<"x-in ve y -in unvanlari "<<&x<<" , "



<<&y<<"\n";

// z-te x-in unvanin menimsedek

z=&x;


std::cout<<"z-in ilkin qiymeti "<
<<"bu unvanda olan melumat "<<*z<<"\n";

// unvan deyisheninin qiymete gore oturulmesi

funk1(z);

std::cout<<"z-in funk1-den sonraki qiymeti "<
<<"bu unvanda olan melumat "<<*z<<"\n";

// unvan deyisheninin unvana gore oturulmesi

funk2(&z);

std::cout<<"z-in funk2-den sonraki qiymeti "<
<<"bu unvanda olan melumat "<<*z<<"\n";

return 0;

}

Proqramı icra edək:



C:\cpp\prog2\Debug>

C:\cpp\prog2\Debug>prog2.exe

x-in ve y -in qiymetleri 35 , 68

x-in ve y -in unvanlari 0x6013a0 , 0x6013a4

z-in ilkin qiymeti 0x6013a0

bu unvanda olan melumat 35

z-in funk1 daxilinde qiymeti 0x6013a4

bu unvanda olan melumat 68

z-in funk1-den sonraki qiymeti 0x6013a0

bu unvanda olan melumat 35

z-in funk2 daxilinde qiymeti 0x6013a4

bu unvanda olan melumat 68

z-in funk2-den sonraki qiymeti 0x6013a4

bu unvanda olan melumat 68

C:\cpp\prog2\Debug>

C:\cpp\prog2\Debug>

Izahı:


Proqramda qlobal x,y dəyişənləri və z ünvan dəyişəni elan edirik. Əvvəlcə x y-in

qiymətlərini və ünvanlarını çap edirik. Daha sonra z-tə x-in ünvanın mənimsədirik. funk1 ə z-ti qiymətə görə parametr kimi ötürürük. funk1-in daxilində z-in qiymətin dəyişib y-in ünvanına mənimsədirik. funk1-dən sonra z-in qiyməti dəyişməmişdir, o əvvəlki kimi x-ə istinad edir. funk2 -yə isə z-ti ünvana görə ötrürük, buna görə funk2 daxilində z üzərində etdiymiz dəyişiklik funksiya qayıtdıqdan olduğu kimi saxlanılır.



Yüklə 0,74 Mb.

Dostları ilə paylaş:
1   2   3   4   5   6   7   8   9   10   11




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©genderi.org 2024
rəhbərliyinə müraciət

    Ana səhifə