Adres olish amali - O„zbekiston respublikasi oliy va o„rta maxsus ta‟lim vazirligi samarqand davlat universiteti...

|
O„zbekiston respublikasi oliy va o„rta maxsus ta‟lim vazirligi samarqand davlat universiteti s. Eshtemirov, F. M. Nazarov Pdf ko'rish
|
bet | 117/164 | Sana | 25.01.2024 | Hajmi | 2,67 Mb. | | #146073 |
Bog'liq ALGORITMLASH VA DASTURLASH ASOSLARIAdres 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 b 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 amali n ning 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 4
ayrilyapdi (16lik sanoq sistemasida).
Demak, biror o‗zgaruvchining xotiradagi adresini 1ga oshirmoqchi
bo‗lsak,uning qiymati 1 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.
|
|
Bosh sahifa
Aloqalar
Bosh sahifa
O„zbekiston respublikasi oliy va o„rta maxsus ta‟lim vazirligi samarqand davlat universiteti s. Eshtemirov, F. M. Nazarov
|