بین اشارهگرها و آرایهها رابطه نزدیکی وجود دارد. نام آرایه در واقع اشارهگری به اولین عنصر آن است. قطعه برنامه زیر را درنظر بگیرید.
char str[80] , *p ;
p = str ;
میدانیم که نام آرایه همان آدرس اولین عنصر آرایه است. بنابراین دو دستور
p = &str[0] ;
p = str ;
همارزند. پس در قطعه برنامه بالا در اشارهگر p، آدرس آرایه (یعنی آدرس اولین عنصر آرایه) قرار داده شده است. حال اگر بخواهیم به پنجمین عنصر در str دسترسی داشته باشیم، میتوانیم این کار را به دو روش زیر انجام دهیم.
str[4]
یا
*(p+4)
هر دو دستور، پنجمین عنصر را برمیگردانند.
همین طور اگر داشته باشیم
int a[15] , *p ;
p = &a[0] ;
دو عبارت a[3] و *(p+3) همارزند و هر دو چهارمین عنصر از ۱۵ عنصر را برمیگردانند؛ یعنی، به طور کلی عنصر a[k] همارز با *(p + k) خواهد بود و هر دو محتوای خانه k اُم آرایه a یا (k+1) اُمین عنصر از مجموعه عناصر مزبور را برمیگردانند. همین طور عبارت مزبور همارز *(a + k) است، زیرا a نام آرایه، معرف آدرس آغاز آن است و (a + k) آدرس خانه k اُم آرایه خواهد بود و در نتیجه عنصر *(a + k) محتوای خانه k اُم از آرایه مزبور را برمیگرداند. بنابراین C، سه روش برای دستیابی به عناصر آرایه در اختیار ما قرار میدهد. اما مهم است بدانیم که دستیابی به عناصر آرایه از طریق اشارهگر، سریعتر از روش استفاده از اندیس است. لذا روش *(p + k) و همین طور *(a + k) سریعتر از a[k] عمل میکند. بدین لحاظ استفاده از اشارهگرها برای دستیابی به عناصر آرایه، روش بسیار متداولی در زبان C است.
حال برای تفسیر k در عبارتهای *(p+k) و *(p+k) به دو برنامه زیر توجه کنید.
main ()
{
static int nums[ ] = {92 , 81 , 70 , 69 , 58} ;
int k ;
for (k = 0 ; k<5 ; k+ +)
printf (” %d\n ” , nums[k]) ;
}
خروجی برنامه
برنامه مزبور برنامه سادهای است که در آن برای دستیابی به عناصر آرایه از روش متعارف علامتگذاری آرایه استفاده شده است.
حال همان برنامه با روش به کارگیری از اشارهگر به صورت زیر خواهد بود.
/* uses pointers to print out values from array */
main ()
{
static int nums[ ]= {92 , 81 , 70 , 69 , 58}
int k ;
for (k=0 ; k<5 ; k++)
printf (” %d\n “, *(nums + k)) ;
}
شکل ۸ـ۳ نشان میدهد که منظور از *(nums+k) محتوای k خانه، بعد از nums است که در آن بزرگی هر خانه مساوی بزرگی داده یا شئی مورد نظر در آرایه برحسب بایت است که در مثال بالا ۲ بایت است. همچنین در عبارت *(nums + k) نقش اپراتور ستاره را بهعنوان عملگر غیرمستقیم ملاحظه میکنید که محتوای خانه یا آدرس nums+k را در اختیار قرار میدهد.
از موارد بالا نتیجه میشود که array[index] با *(array + index) یکسان است.
همچنین دو راه برای مراجعه به آدرس عنصری از آرایه وجود دارد. یکی به صورت nums+k در فرم اشارهگر و دیگری به صورت nums[k] در فرم آرایه.
حال اجازه دهید با برنامهای ساده، رابطه بین عناصر آرایه و آدرس آنها را بررسی کنیم.