ارتباط اشاره گرها و آرايه ها

   آرايه ها و اشاره گرها در زبان ++C ارتباط نزديکی با يکديگر داشته و تقريباً می توان آنها را به جای يکديگر به کار برد نام آرايه را می توان به عنوان يک اشاره گر ثابت در نظر گرفت و تمام اعمالی که توسط انديس آرايه می توان انجام داد توسط اشاره گر نيز قابل انجام است و از طريق اشاره گر نيز می توان به تک تک عناصر آرايه دست يافت . دستور زير را در نظر بگيريد :

int b[5];
int bptr;

   از آنجا که نام آرايه (بدون انديس) اشاره گری به عنصر اول آرايه می باشد ، می توانيم اشاره گر bptr را توسط دستور زير، به اولين عنصر آرايه b اشاره دهيم :

bptr = b;

   و يا می توانيم از دستور زير برای اشاره دادن bptr به عنصر اول آرايه b استفاده کنيم :

bptr = &b[0]

   برای دستيابی به عنصر b[3] توسط اشاره گر bptr که توسط يکی از دستورهای فوق به آرايه b مرتبط شد، می توان از دستور زير استفاده کرد :

*(bptr + 3)

   در مبحث قبل با مفهوم bptr+3 و عباراتی از اين قبيل آشنا شده ايد. از آنجايی که bptr به عنصر اول آرايه اشاره می کند پس حاوی آدرس عنصر اول آرايه يعنی b[0] می باشد، لذا bptr+3 آدرس خانه b[3] خواهد بود پس
*(bptr + 3) به خانه b[3] اشاره خواهد کرد . توجه داشته باشيد که استفاده از پرانتز در اينجا اجباری می باشد ، چون عملگر * اولويت بالاتری نسبت به عملگر + دارد . اگر دستور فوق را بدون پرانتز به کار ببريم يعنی از bptr+3* استفاده کنيم عدد 3 به خانه b[0] اضافه می گردد .

   توجه داشته باشيد که *(b + 3) ( در اينجا b نام آرايه ای می باشد که در دستورات فوق تعريف گرديد ) نيز به خانه b[3] از آرايه اشاره می کند ، چون همانطور که در ابتدای اين بحث گفته شد نام آرايه همانند يک اشاره گر ثابت می باشد .

   اشاره گرها را نيز می توان مانند آرايه ها انديس دار کرد ، به عنوان مثال bptr[1] به عنصر b[1] رجوع خواهد کرد چون bptr اشاره گری به آرايهb می باشد .

   نکته : همانطور که می دانيد نام آرايه ، اشاره گر ثابتی می باشد لذا دستوری مانند b+=3; برای آرايه ای با نام b قابل استفاده نمی باشد ، چون اشاره گر ثابت همواره به يک خانه از حافظه اشاره می کند .

   برای درک نحوه ارتباط و شباهت آرايه ها و اشاره گرها ، به برنامه زير که در آن عناصر آرايه ای توسط چهار روش متفاوت در خروجی چاپ می شوند ، توجه کنيد :

#include <iostream.h>
 
void main()
{
  int b[] = { 10, 20, 30, 40 };
  int *bPtr = b;
  int i;
 
  cout << "b[i]:\n";
  for ( i = 0; i < 4; i++ )
    cout << "b[" << i << "] = " << b[ i ] << '\n';
 
  cout << "\n*(b + i):\n";
  for ( i = 0; i < 4; i++ )
    cout << "*(b + " << i << ") = "
         << *( b + i ) << '\n';
 
 
  cout << "\nbPtr[i]:\n";
  for ( i = 0; i < 4; i++ )
    cout << "bPtr[" << i << "] = " << bPtr[ i ] <<'\n';
 
  cout << "\n*(bPtr + i):\n";
  for ( i = 0; i < 4; i++ )
    cout << "*(bPtr + " << i << ") = "
         << *( bPtr + i ) << '\n';
 
}

خروجی برنامه فوق به صورت زير می باشد :

b[i]:
b[0] = 10
b[1] = 20
b[2] = 30
b[3] = 40
 
*(b + i):
*(b + 0) = 10
*(b + 1) = 20
*(b + 2) = 30
*(b + 3) = 40
 
bPtr[i]:
bPtr[0] = 10
bPtr[1] = 20
bPtr[2] = 30
bPtr[3] = 40
 
*(bPtr + i):
*(bPtr + 0) = 10
*(bPtr + 1) = 20
*(bPtr + 2) = 30
*(bPtr + 3) = 40
 

 

   معرفی کامپيوتروبرنامه نويسی

   ساختارهای کنترلی

   توابع

   آرايه ها

   اشاره گر ها و رشته ها

   کلاسها

   گرانبار کردن عملگر ها

 
 
 
   
 
 
 

حق کپی رایت محفوظ می باشد