برای فهم بهتر اشاره گر ها باید بیشتر با متغییر ها آشنا شویم
همان طور که می دانید متغییر ها شناسه هایی هستند که به
قسمت هایی از حافظه نسبت داده می شوند
هر متغیر چند ویژگی دارد
1.نام متغییر
2.نوع(int,float,char,double)
3.کلاس حافظه(auto,register,extern,static)
4.آدرس حافظه(مقادیردرون متغییر در این حافظه قرار میگیرد
در واقع آدرس همان حافظه ای که نام متغییر به آن نسبت
داده شده)
5.محتویات یا مقدار(هر آنچه درون حافظه مربوط به متغییر قرار
دارد.)
خب حالا اشاره گر وارد می شود
اشاره گر ها هم نوع خاصی از متغییر ها هستند مقادیر این
متغییر ها (صرف نظر از نوعشون) آدرس های حافظه است
این نوع خاص از متغییر ها با قرار دادن آدرس حافظه دیگر
متغییر ها درون خودامکان دسترسی به محتویات متغییر های دیگر
را به مامیدهند البته ممکن آدرس حافظه ای که درون اشاره
گر قرار دارد وبه اصطلاح به آن اشاره می کند مر بوط به متغییر
دیگری نباشد.
تعریف اشاره گرها:
int *pa,a;
float f,*Pf;
در تعریف های بالا متغیر هایی که قبل از نامشان *آمده اشاره گر
هستند(Pa,Pf)
درمورد عملگرهای *و& باید گفت که *قبل از نام اشاره گر به
معنی محتویات محل مورد اشاره اشاره گر است و& قبل از
نام متغییر به معنی آدرس حافظه مربوط به متغییر است هر دو
این عملگر ها همچنین در تعریف اشاره گرها و رفرنسها استفاده
می شوندکه در این دومورد معانی ذکر شده را ندارد(مثل تعاریف
بالا) وفقط می گویند که متغییر تعریف شده اشاره گر است یا این
که رفرنس است و هیچ معنی دیگری ندارد.
رفرنس ها چیزی شبیه اشاره گر ها هستند که بعدا توضیح میدهم
مثالی از اشاره گرها:
int *pa,a;
a=3;
pa=&a;
cout<<*pa<<" "<<pa<<" " <<a<<endl;
*pa=*pa+2;
cout<<a<<" "<<*pa<<endl;
a=a-2; //or a=*pa-2;
cout<<a<<" "<<*pa<<endl;
Run
3 0x8f37fff2 3
5 5
3 3
همان طور که می بینبد اول آدرس متغییر aبا استفاده از &بدست
آورده شده سپس درون متغییر اشاره گر paقرارداده شده از این به
بعد این اشاره گر به متغییر aاشاره می کند (دقت کنید که این موضوع
همیشگی نیست شما میتوانید بار دیگر آدرس دیگری در متغییر
اشاره گر قرار دهید تا به جای دیگری اشاره کند) از این به بعد می توان
با قراردادن عملگر* قبل از paبه محتویات aدست یابی داشت.
بهترین راه حل برای فهم کار با اشاره گرها استفاده از نمودار درختی
با توجه به شکل کاملا روشن است که paوaهردو متغیرهایی درون حافظه هستند لذاpaنیز مانند aخود دارای حافظه و آدرس حافظه است اما تفاوت در مقادیری است که در حافظه ی این متغیرها قرارمی گیرد با توجه به شکل درونaیک مقدارعددی مثلا 3 قرار می گیرد اما در paآدرس حافظه قرار میگیرد که در اینجا آدرس حافظه ی متغییر aمیباشد در این حالت گفته می شود اشاره گر paبه aیا به آدرس aاشاره دارد.ومی توان با عبارت *paبه حافظه ی aدسترسی داشت.در واقع بعد از دستور انتساب pa=&a;
عبارت های *paوaیک چیزند.البته از دید ما اما کامپایلر ....
می توان تصور کرد یک چیزند.
رفرنس ها:
دریک تعریف ساده می توان گفت رفرنس نام دوم بری متغیر های دیگر است.
یا رفرنس متغیریست که خود حافظه ندارد و از حافظه ی دیگر متغیرها استفاده می کند.رفرنسها در لحظه ای ایجاد می شوند مقدار اولیه می گیرند این مقدار اولیه در واقع یک آدرس حافظه می باشد که بر خلاف اشاره گرها غیر صریح نسبت داده میشود به این صورت که یک متغیر را به عنوان مقدار اولیه می گیرد اما در حقیقت این آدرس متغیر مبدا است که به رفرنس نسبت داده می شود.
به نحوه تعریف رفرنس توجه کنید.
;متغیر مبدا=نام رفرنس& نوع داده ای
int x=10;
int &ref2x=x;
بعد از اجرای دودستور اخیر xوref2xیک چیزند.با تغییر یکی دیگری هم تغییر میکند خلاصه این که مانند قسمتی از حافظه است که دو نام دارد.
در تفکری دیگر می توان تصور کرد که رفرنس اشاره گریست که فقط یک بار آدرس حافظه می گیرد و از آن به بعد مثل یک متغیر معمولی رفتار میکند و مارا از شر عملگر های &و* راحت میکند.البته این به واقعیت نزدیک نیست.تفکر قبلی صحیح تر است.
رفرنس محدودیت هایی دارد.
1.نمی توان اشاره گر به رفرنس تعریف کرد
2.نمی توان برای یک رفرنس رفرنس دیگر ی تعریف کرد.
3.نمی توان آرایه ای از رفرنس ها ایجاد کرد.
4.نمی توان آدرس یک مرجع را بدست آورد
شاید بتوان گفت معنی تمام این ها این است که نمی توان اشاره گر ها و رفرنس هارا در هم آمیخت.


