• Adresdagi qiymatlar ustida amallarni bajarish
  • 0x288ff3c dan 4 ayrilyapdi (16lik sanoq sistemasida). Demak, biror o‗zgaruvchining xotiradagi adresini 1
  • O„zbekiston respublikasi oliy va o„rta maxsus ta‟lim vazirligi samarqand davlat universiteti s. Eshtemirov, F. M. Nazarov




    Download 2,67 Mb.
    Pdf ko'rish
    bet117/164
    Sana25.01.2024
    Hajmi2,67 Mb.
    #146073
    1   ...   113   114   115   116   117   118   119   120   ...   164
    Bog'liq
    ALGORITMLASH VA DASTURLASH ASOSLARI

    Adres olish amali 
    C++ dasturlash tilida biror bir o‗zgaruvchini uning sinonimi bilan 
    almashtirib unga murojat qilish imkoniyati mavjud. Biror bir o‗zgaruvchining 
    boshqa o‗zgaruvchiga adresini olish mumkin va unga murojat qilish uchun keyingi 
    adres bo‗yicha murojat qilinadi. C++ dasturlash tilida adres olish amalining 
    umumiy ko‗rinishi quyidagicha bo‗ladi: 
    &
    Adres olish amali asosan ko‗p hollarda funksiya parametrlari sifatida 
    olinadi, adres olish amalini C++ dasturlash tilida quyidagi dastur orqali tushuntirib 
    o‗tamiz: 
    #include  
    using namespace std;
    int main()
    { int x=12; 
    int &a=x; 
    a=(a+2)/2; 
    cout<<‖a=‖<return 0;
    }
    Dastur natijasi 
    a=7 
    Adres oluvchi o‗zgaruvchining ko‗rsatkichdan farqi shundaki, u xotiradan 
    alohida joy egallamaydi va faqat o‗z qiymati bo‗lgan o‗zgaruvchining boshqa nom 
    sifatida ishlatiladi. 
    Adresdagi qiymatlar ustida amallarni bajarish 
    Ba‘zan o‗zgaruvchilarning xotirada egallangan joyini hisobga olishga ham 
    to‗g‗ri keladi. 32 razryadli mashinalarda: 
    1 ta belgi 1 bayt, butun turli (int) va haqiqiy turli (float) o‗zgaruvchilar to‗rt 
    bayt, suzuvchi vergulli (double) turli o‗zgaruvchilar sakkiz bayt joyni egallaydi. 


    187 
    Ko‗rsatkichdan qiymat berish buyrug‗ining chap tarafidan foydalanish 
    mumkin. Bu holda u qandaydir qiymatni oladi va shu qiymatni o‗sha adresga yozib 
    qo‗yadi. Ushbu holatni quyidagi dasturni tahlil qilish bilan tushunish mumkin.
    #include  
    using namespace std; 
    int main( ) 

    int *p, x=100; cout <<"x ning eski qiymati= "<p=&x; cout<<"x o`zgaruchining adresi= "<
    *p=213; 
    cout<<"x ning yangi qiymati= "<system(―pause‖); 
    return 0; 

    Dastur natijasi quyidagicha bo‗ladi: 
    x ning eski qiymati= 100 
    x o‗zgaruvchining adresi= 0x28ff44 
    x ning yangi qiymati= 213 
    Shuningdek, ko‗rsatkich yordamida u ko‗rsatgan adresdagi qiymatning ustida 
    inkrement va dekrement amallarini bajarish mumkin. Bunda ko‗rsatkich qavs 
    ichida yozilishi shart. Chunki inkrement va dekrement amallari ko‗rsatkichga 
    nisbatan oldin bajariladi. Buni quyidagi dastur misolida tushunish mumkin. 
    #include  
    using namespace std; 
    int main( ) 

    float x=54.25, *p1; cout <<‖x="<p1=&x; cout <<"x ning adresi="<
    (*p1)++; cout <<"x="<(*p1)++; cout <<"x="<(*p1)--; cout <<"x="<*p1=13; cout <<"x="<(*p1)++; cout <<"x="<(*p1)++; cout <<"x="<(*p1)--; cout <<"x="<


    188 
    system(―pause‖); return 0;} 
    Dastur natijasi quyidagicha bo‗ladi: 
    x=54.25 
    x ning adresi= x28ff44 
    x=55.25 
    x=56.25 
    x=55.25 
    x=13 
    x=14 
    x=15 
    x=14 
    Endi ko‗rsatkichlar ustida arifmetik amallarni bajarish bilan tanishamiz: 
    Bizga ma‘lumki, float *a, *b; buyrug‗i bo‗yicha a va nomli ko‗rsatkichlarni 
    aniqlaymiz. Agar a=&n; buyrug‗i bo‗yicha a ko‗rsatkichning qiymati n ning 
    xotiradagi adresiga teng bo‗ladi. Shundan so‗ng (*a) ko‗rsatkich n ning EHM 
    xotirasidagi qiymatiga teng qiymatni oladi. Lekin, a=&n; buyrug‗i bo‗lmasa (*a) 
    ham hech qanday qiymatni olmaydi. Chunki adressiz ko‗rsatkich qaysi qiymatni
    olishi mumkin? Agar a=&n; buyrug‗idan keyin (*a)++ buyrug‗i o‗rniga a++ 
    buyrug‗idan foydalansak, bu inkrement amalining EHM xotirasidagi adresiga 
    birni qo‗shmaydi, balki shu adresdan keyingi adres qiymatiga teng qiymatni oladi. 
    Masalan, nningxotiradagi adresi 0x28ff3c bo‗lsa, a++ ning qiymati 0x28ff40 
    bo‗ladi. Bunda 0x28ff3c ning ustiga 4 ni qo‗shdi. Chunki yuqorida qayd 
    qilganimizdek,  float turli o‗zgaruvchilar xotirada 4 bayt joyni egallaydi. 
    Tabiiyki, a=&n; cout<<- - a <<`\n`; buyrug‗i natijasi 0x288ff38 bo‗ladi. 
    Bunda a ning dastlabki qiymati hisobga olinyapdi, ya‘ni 0x288ff3c dan
    ayrilyapdi (16lik sanoq sistemasida). 
    Demak, biror o‗zgaruvchining xotiradagi adresini 1ga oshirmoqchi 
    bo‗lsak,uning qiymati ga emas, balkio‗sha o‗zgaruvchining xotirada egallaydigan 
    joyining hajmi qadar oshadi. 
    Xuddi shuningdek, ko‗rsatkichga qandaydir butun sonni qo‗shsak yoki ayirsak 
    o‗sha ko‗rsatkich turi xotirada egallaydigan joyi hajmini berilgan butun songa 
    ko‗paytirilgani qadar sonni qo‗shish yoki ayirish natijasiga teng bo‗ladi. 
    Aytilganlar bo‗yicha quyidagi dasturni va uning natijalarini tahlil qiling. 
    #include  
    using namespace std; 
    int main( ) 


    189 

    int *y,a,n=-3; 
    y=&n; cout <<"*y="<<*y<<'\n'; 
    cout <<"y="<y=y+5; cout <<"y+5="<y=y-8; cout <<"y-8="<y=&n-5; cout <<"&n-5="<system ("pause"); 
    return 0;} 
    Dastur natijasi quyidagicha bo‗ladi. 
    *y=-3 
    y=0x28ff3c 
    y+5=0x28ff50 
    y-8=0x28gg30 
    &n-5=0x28ff28 
    Bunda amallar 16 lik sanoq sistemasida bajarilmoqda. Ko‗rsatkichlar ustida 
    qo‗shish amalini bajarib bo‗lmaydi. Lekin, ikkita ko‗rsatkich ustida ayirish amalini 
    bajarish mumkin. Bu holni quyidagi dastur misolida namoyish qilamiz. 
    #include  
    #include  
    using namespace std; 
    int main( ) 

    int *y, *z,a, n=-3; a=14; 
    y=&n; cout <<"y="<z=&a; cout <<"z="<cout <<"z-y="<cout <<"*z-*y="<<*z-*y<<'\n'; 
    cout <<"*z+*y="<<*z+*y<<'\n'; 
    system ("pause"); 
    return 0;} 
    Dastur natijasi quyidagicha bo‗ladi. 
    y=0x28ff34 
    z=0x28ff38 
    z-y=1 


    190 
    *z-*y=17 
    *z+*y=11 
    Dasturni va uning natijalarini mustaqil tahlil qiling. 

    Download 2,67 Mb.
    1   ...   113   114   115   116   117   118   119   120   ...   164




    Download 2,67 Mb.
    Pdf ko'rish

    Bosh sahifa
    Aloqalar

        Bosh sahifa



    O„zbekiston respublikasi oliy va o„rta maxsus ta‟lim vazirligi samarqand davlat universiteti s. Eshtemirov, F. M. Nazarov

    Download 2,67 Mb.
    Pdf ko'rish