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( )
190
*z-*y=17
*z+*y=11
Dasturni va uning natijalarini mustaqil tahlil qiling.