|
ارتباط اشاره گرها و آرايه ها |
آرايه ها و اشاره گرها در زبان ++C
ارتباط نزديکی با يکديگر داشته و تقريباً می توان آنها را به جای
يکديگر به کار برد نام آرايه را می توان به عنوان يک اشاره گر ثابت
در نظر گرفت و تمام اعمالی که توسط انديس آرايه می توان انجام داد
توسط اشاره گر نيز قابل انجام است و از طريق اشاره گر نيز می توان
به تک تک عناصر آرايه دست يافت . دستور زير را در نظر بگيريد :
از آنجا که نام آرايه (بدون انديس) اشاره گری به عنصر اول آرايه می
باشد ، می توانيم اشاره گر
bptr
را توسط دستور زير، به اولين عنصر آرايه
b
اشاره دهيم :
و يا می توانيم از دستور زير برای اشاره دادن
bptr
به عنصر اول آرايه
b
استفاده کنيم :
برای دستيابی به عنصر
b[3]
توسط اشاره گر
bptr
که توسط يکی از دستورهای فوق به آرايه
b
مرتبط شد، می توان از دستور زير استفاده کرد :
در مبحث قبل با مفهوم
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
|