عملیات متداولی که روی اشارهگرها انجام میشوند عبارتاند از انتساب، محاسبه، و مقایسه که به شرح هر یک میپردازیم.
الف) انتساب
در مورد اشارهگرها نیز مشابه سایر انواع متغیرها، میتوان مقداری را به متغیر اشارهگر نسبت داد. اما به طوری که گفتیم، این عمل مانند سایر متغیرها گسترده نیست. به متغیر اشارهگر میتوان آدرس متغیر یا مقدار صفر نسبت داد.
ب) محاسبه
زبان C اجازه میدهد که مقدار صحیحی را به اشارهگر اضافه و یا از آن کسر کنید. برای مثال اگر p متغیر اشارهگر باشد، عباراتی مشابه p+5 و p-5 معتبر است. ولی باید به مفهوم آن دقت کافی شود. برای مثال مفهوم p+5 آن است که به پنج شئی بعد از شئی که p به آن اشاره میکند اشاره خواهد کرد. بنابراین اگر p آدرس متغیری از نوع short int p ; را داشته باشد که دو بایت حافظه اشغال میکند، عبارت p+5 به (۱۰ = ۲×۵) ۱۰ بایت بعد از آدرسی که p معرف آن است اشاره خواهد کرد. حال اگر p آدرس متغیری از نوع float p ; را در خود داشته باشد، عبارت p+5 به (۲۰ = ۴×۵) ۲۰ بایت بعد اشاره خواهد کرد. بنابراین p+5 همیشه به مفهوم به اندازه ۵ شئی بعد از آنکه p اشاره میکند خواهد بود. پس کامپایلر ۵ را در بزرگی یا طول شئی مورد نظر برحسب بایت ضرب میکند و آن را بر محتوای p اضافه میکند تا آدرس جدید به دست آید. بنابراین عملیات محاسباتی روی اشارهگرها، چهار عمل افزودن، کاستن، ++ و — است.
اگر دو متغیر اشارهگر از یک نوع باشند، یعنی اشیایی که اشارهگرهای مزبور به آن اشاره میکنند یکسان باشند، میتوان مقادیر آن دو اشارهگر را از هم تفریق کرد. برای مثال مقدار &a[3] – &a[0] برابر ۳ خواهد بود. در واقع این تفاضل تعداد اشیاء بین این دو اشارهگر را معرفی میکند.
مثال به برنامه زیر توجه کنید.
#include<stdio.h>
main ()
{
int *px , *py ;
static int A[6] = {1 , 2 , 3 ,4 , 5 , 6};
px = &A[0] ;
py = &A[5] ;
printf(“px=%x py=%x” , px , py) ;
printf(“\n py – px =%x” , py – px) ;
}
خروجی خط اول برنامه آدرس دو متغیر px و py بر حسب هگزادسیمال خواهد بود و خروجی خط دوم مقدار ۵ است.
ج) مقایسه
متغیرهای اشارهگر را، که هر دو به دادههایی از یک نوع مشابه اشاره داشته باشند، میتوان با هم مقایسه کرد. به عبارت دیگر دو اشارهگر را میتوان در یک عبارت رابطهای با یکدیگر مقایسه کرد.
مثال فرض کنید px و py اشارهگرهایی باشند که به عناصری از یک آرایه اشاره میکنند. چند عبارت منطقی حاصل از این دو متغیر به این شکل خواهد بود.
px < py
px >= py
px = = py
px != py
px = = null
همچنین دستورهای زیر درست است.
if (px<py)
printf (“px points to lower memory than py”) ;
else
printf (“px points to upper memory than py”) ;