Ko'rsatkichlar bilan ishlashda * va & operatsiyalari
Ko'rsatkichlar bilan ishlashda asosan & va * operatorlari qo'llaniladi. & operatori o'z operandining manzilini qaytaradi.
Misol uchun, agar a o'zgaruvchisi quyidagicha e'lon qilingan bo'lsa:
float a;
operator
_a=&a;
a o‘zgaruvchining manzilini adr_a o‘zgaruvchisiga yozadi, adr_a o‘zgaruvchisi float tipiga ko‘rsatgich bo‘lishi kerak. U quyidagicha tavsiflanishi kerak:
*adr_a;
* operatsiyasi & operatsiyasining teskarisini bajaradi. U berilgan manzilda saqlangan o'zgaruvchining qiymatini qaytaradi.
Masalan, operator
=*adr_a;
a o'zgaruvchisiga adr_a manzilida saqlangan haqiqiy qiymatni yozadi.
ko'rsatkichni belgilash operatsiyasi.
Bir ko'rsatkichning qiymati boshqasiga tayinlanishi mumkin. Agar ko'rsatkichlar bir xil turdagi bo'lsa, u holda odatiy belgilash operatsiyasi yordamida birini boshqasiga tayinlash mumkin.
Quyidagi misolni ko'rib chiqing
#include
#include main()
{PI=3.14159,*p1,*p2;=p2=Π
printf(" Muallif manzil p1=%p saqlanadi *p1=%g\n",p1,*p1);(" By manzil p2=%p saqlanadi *p2=%g\n",p2,*p2);
Bu dastur quyidagilarni belgilaydi: PI=3,14159 haqiqiy o'zgaruvchi va p1 va p2 float turiga ikkita ko'rsatgich. Keyin PI o'zgaruvchisining manzili p1 va p2 ko'rsatkichlariga yoziladi. Printf iboralari p1 va p2 manzillarini va shu manzillarda saqlangan qiymatlarni chop etadi. Manzilni chiqarish uchun %p tipi spetsifikatoridan foydalaniladi. Ushbu dastur natijasida p1 va p2 o'zgaruvchilari PI=3.14159 haqiqiy o'zgaruvchisi saqlanadigan bir xil manzilning qiymatini saqlaydi.
*p1=3,14159 p1=0012FF7C da saqlanadi
*p2=3,14159 p2=0012FF7C da saqlanadi
Agar ko'rsatkichlar har xil turlarga tegishli bo'lsa, u holda bir ko'rsatgichning qiymatini boshqasiga belgilashda siz turdagi konversiyadan foydalanishingiz kerak. Konvertatsiya qilmasdan, istalgan ko'rsatgichga void * ko'rsatkichini belgilashingiz mumkin. Har xil turdagi ko'rsatkichlar bilan ishlash misolini ko'rib chiqing.
#include
#include main()
{ PI =3,14159,* p 1;
ikki marta *p2;
//p1 o'zgaruvchisiga PI=&PI manzilini yozamiz;
// ishora qiluvchi qiymatni ikki marta belgilash uchun ko'rsatgich
// float turi .=( double *) p 1;
printf("p1=%p manzili *p1=%g\n",p1,*p1);("p2=%p manzilda *p2=%e\n",p2,*p2 saqlanadi);
}
*p1=3,14159 p1=0012FF7C da saqlanadi
*p2=2.642140e-308 p2=0012FF7C da saqlanadi
p1 va p2 ko'rsatkichlari bir xil manzilni saqlaydi, ammo ular ko'rsatadigan qiymatlar boshqacha. Buning sababi, *float ko'rsatkichi 4 baytga, * juft ko'rsatkich esa 8 baytga murojaat qiladi. Topshiriqdan keyin p2=(double *)p1; *p2 ga kirishda quyidagilar sodir bo'ladi: p1 da saqlangan o'zgaruvchiga xotiradan yana 4 bayt qo'shiladi. Natijada *p2 qiymati *p1 qiymatiga mos kelmaydi.
#include
#includemain()
{PI=3.14159,*p1;*p2;=Π=(float *)p1;
printf(" Muallif manzil p1=%p saqlanadi *p1=%g\n",p1,*p1);(" By manzil p2=%p saqlanadi *p2=%e\n",p2,*p2);
}
Topshiriqdan keyin p2=(double *)p1; *p2 ga kirishda quyidagilar sodir bo'ladi: p1 da saqlangan o'zgaruvchidan faqat 4 bayt ajratiladi. Natijada, bu holda *p2 qiymati *p1 qiymatiga mos kelmaydi.
Bu quyidagi xulosaga olib keladi: har xil turdagi ko'rsatgichlarni o'zgartirganda, tipni quyish faqat tayinlashning sintaktik muammosini hal qiladi. Shuni esda tutish kerakki, bir xil manzilga ishora qiluvchi har xil turdagi ko'rsatkichlar ustidagi * operatsiyasi turli qiymatlarni qaytaradi.
Agar keyingi bayonot bo'lsa
*p;
keyin p o'zgaruvchisi manzilni saqlaydi va *p konstruktsiyasidan foydalanib siz p manzilida saqlangan qiymatni olishingiz mumkin.
Operatordan foydalanilganda
p;
keyin &p konstruktsiyasi manzilni hisoblash uchun ishlatiladi va p o'zgaruvchisi haqiqiy qiymatni o'z ichiga oladi.
Do'stlaringiz bilan baham: |