C Proqramlaşdırmasında İşarə Aritmetikası

Daha əvvəl də gördüyümüz kimi, göstərici dəyişən olsa da və fərqli məlumat dəyərlərinə işarə etsə də, dəyişənlərin yaddaş ünvanını saxlayır. Bu yaddaş ünvanları onaltılıq formada və rəqəmlərin bir növüdür. Beləliklə, yaddaş ünvanı və buna görə göstəricilər üzərində hesab hesablamaları edə bilərik. Göstəricilərdə yerinə yetirilməsinə icazə verilən dörd əsas hesab əməliyyatı var - artırma ('+' və '++') və azaltma ('-' və '-'). Bunlar göstəricilərdə saxlanılan ünvanları artırmaq və azaltmaq üçün istifadə olunan birtərəfli operatorlardır.

1000 yaddaş ünvanını göstərən bir intPtr tam göstəricisini nəzərdən keçirək. İndi intPtr-də artım operatoru '++' istifadə etsək, yaddaş ünvanını növbəti tam ədədi ünvanına artıracaqdır. İdeal olaraq '++' dəyəri 1 artıracaq, ancaq ünvan / göstəricilərə tətbiq edildikdə, məlumat növünü nəzərə alacaq və ünvanı müvafiq olaraq artıracaqdır. Beləliklə, burada göstəricini artırdığımızda kompilyator əvvəlcə onun tipini yoxlayacaq. Tam bir göstərici olduğundan, növbəti tam ədədin yerini göstərərək, ünvanı 4-ə artıracaq; 1004, başqa bir tam dəyişənin ünvanıdır. İndi * intPtr yazsaq, 100 deyil, 50 göstərilir (artmadan əvvəl dəyəri belə idi). Xarakter göstəricisində '++' istifadə etsək, kompilyator ünvanı yalnız 1 artıracaqdır. Tutaq ki, bir struktur göstəricisi artırılıb, o zaman ünvanı strukturun ölçüsünə görə artıracaq. Bunun səbəbi, strukturun elementləri tutması üçün bu boşluqlara ehtiyacı olması və digər dəyişənlərin və ya göstəricilərin bu boşluqları tutmasına imkan verməməsidir. Beləliklə, kompilyator göstəricinin məlumat növünə uyğun olaraq ünvanı artırır.

intPtr ++; // göstəricinin dəyərini artırır və yeni dəyəri intPtr-in özünə verir

 

Artırarkən '*' istifadə etmədiyimizə diqqət yetirin. Bir göstəricinin saxladığı ünvanı artırdığımız üçün yalnız göstərici dəyişən adından istifadə olunur. Göstərici dəyişən adı ilə birlikdə '*' istifadə etsək, işarə etdiyi dəyərə işarə edəcək və həmin dəyər artırılacaqdır (bu, işarə işarəsidirsə və '*' istifadə olunarsa səhv olar!) . Ayrıca öz ünvanını deyil, içərisindəki dəyəri artırdığını unutmayın. Öz ünvanı yuxarıda göstərildiyi kimi bitişik bir ünvan ola bilər və ya olmaya bilər. Ancaq dəyərlər (göstərdiyi dəyişənin ünvanı) məlumat növünə görə ardıcıl olaraq artır.

Eynilə '-' operatorundan istifadə edərək göstəricilərin ünvanını azalda bilərik. Bir göstəricinin ünvanını artırdığı kimi ünvanı azaldır. Yəni göstərici bir xarakter göstəricisidirsə, ünvanı 1 bayta endirir; bir tam göstəricidirsə, onu 4 bayt azaldır və s.

intPtr–;

Göstərici dəyişənini əvvəlcədən artıra / azalda bilərik və ya göstəricidən sonrakı artımı / azaldandan sonra dəyişə bilərik. Bu, hər hansı bir normal dəyişən əvvəlcədən / sonradan artırılmış və ya azaldılmış kimi işləyir. Ancaq fərq yalnız artırılmış və ya azaldılmış bayt sayının göstərici dəyişəninin məlumat növündən asılı olmasıdır. Bu səbəbdən ++ intPtr və intPtr ++ icra edildikdən sonra eyni dəyərlərə sahib olacaqdır. Ancaq əvvəlcə göstərici dəyişəninin ünvanını artıracaq və sonra koddakı ünvan dəyərini istifadə edəcək. İkincisi əvvəl cari ünvanı istifadə edər və sonra ünvan dəyərini artırar. Eynilə –intPtr və intPtr - tərtibçinin onu qiymətləndirmə qaydası xaricində eyni nəticəyə malikdir.

Unary operatorları '++' və '-' yaddaşdakı növbəti yerə ünvanın artırılması və ya azaldılması üçün istifadə olunur. Göstərici ünvanını 10-a keçirməyimiz lazım olsa nə edəcəyik? Kodda 10 dəfə '++' istifadə etməli ola bilərik! Bu rəqəm çox böyükdürsə, kodun uzunluğunu və mürəkkəbliyini düşünün! Beləliklə, C bizə artmaq və azaltma üçün başqa iki unary operatoru '+' və '-' verir. Bu operatorlardan istifadə edərək nə qədər artırılmalı və ya azaldılmalı olduğunu təyin edə bilərik.

Tutaq ki, bir intPtr tam göstəricisini 10-a qədər artırmaq lazımdır, sonra onu aşağıdakı kimi göstəririk:

intPtr = intPtr +10;

OR
intPtr+ = 10; // it is same as above line of code

Burada da, 10-a artdıqda, hər biri 40 bayt tutduğundan, ünvanı 4 bayta köçürəcəkdir. Beləliklə, göstəricini 10 artırdıqdan sonra göstərici dəyişən başqa bir dəyişənin ünvanı olan 1040 ünvanına keçəcəkdir. Zəhmət olmasa, göstərici dəyişəninin (100001, 100002 və s.) Ünvanı ilə artım zamanı ehtiva edən dəyişənin (1000, 1004 və s.) Ünvanı ilə qiymətləri arasındakı fərqi nəzərə alın. Bu göstərici hesabının necə işlədiyini aydınlaşdıracaqdır. Bu göstəricini eyni tipli dəyişənlərə yönəltməyin yollarından biridir.

Yuxarıdakı artımla eyni şəkildə, ünvanı azaltma üçün '-' operatorundan istifadə edə bilərik. Göstərici dəyişəninin məlumat növünü yoxlayaraq ünvanı azaldır.

intPtr = intPtr -10;

OR
intPtr- = 10; // it is same as above line of code

Bu göstərici hesablama konsepsiyası massivlər üçün göstəricilərdən istifadə etməyə səbəb olur. Onlara aşağıda ətraflı baxaq.
Göstəriciləri artırmaq və azaltmaqla yanaşı, hətta onları müqayisə edə bilərik. Göstəriciləri müqayisə etmək üçün '==', '<', '<=', '>' və '> =' müqayisə operatorlarından istifadə edirik. Bu halda ya göstəricinin göstərdiyi ünvanı və ya bir göstəricinin göstərdiyi dəyişənin dəyərlərini müqayisə edə bilərik (göstərici dəyişkənliyindən əvvəl '*' istifadə edərək).

Tutaq ki, intX dəyişəndir, intPtrX isə intX-ə işarə edən dəyişəndir. Fərz edək ki, intX 50 dəyərinə malikdir və ünvanı 1000-dir.

İndi intX və intPtrX ünvanlarını müqayisə etmək istəyiriksə, aşağıdakı kimi müqayisə edirik:

intPtrX == &intX; // checks if addresses are equal, i.e.; 1000 == 1000
intPtrX <= &intX; // checks if address of intPtrX is less than or equal to intX address

Zəhmət olmasa ünvan dəyərlərini almaq üçün tam dəyişən ilə göstərici dəyişəninin qeydləri arasındakı fərqə diqqət yetirin. İşaretçidəki dəyişən '*' və ya '&' olmadan istifadə olunur, çünki burada saxlanan ünvanı əldə etməliyik. Ancaq ünvanını göstərici dəyişənlə müqayisə etməyimiz lazım olduğu üçün tam dəyişən '&' ilə istifadə olunur.

Aşağıdakı halda hansı ünvanlar müqayisə ediləcək?

&intPtrX == &intX; // checks if addresses of pointer variable and integer variables are equal

Kod xəttinin yuxarı hissəsində göstərici dəyişəninin ünvanı, AB2012, tam dəyişənin ünvanı, 1000 ilə müqayisə ediləcəkdir. Beləliklə, göstəricilərdən və onların operatorlarından istifadə edərkən diqqətli olmalıyıq.

Şərh yaz

Translate »