اشاره گرها در سی پلاس پلاس | C++ Pointers
Sianor group گروه سيانور

اشاره گر چیست؟

اشاره گر که معادل فارسی لغت pointer (پوینتر) است همان طور که از نامش پیداست قرار است که اشاره کند! به کجا؟ به یک آدرس حافظه. کدام حافظه؟ حافظه ی RAM. اشاره گرها از مهمترین قابلیتهای C++ هستند. قابلیتی که اگر آن را به خوبی فرا بگیریم، قدرت زیادی به ما می دهد و کوچکترین خطا در استفاده از آن به خطاهای سهمگین تبدیل می شود. اشاره گرها در زبانهای دیگری مثل C# و دلفی هم وجود دارند، لیکن با محدودیتهای فراوانی روبه رو هستند. به طور خاص در مورد C# شما به طور پیش فرض حق ندارید اشاره گر تعریف کنید و باید پشتک باروهای متعددی بزنید تا یک اشاره گر تعریف کنید.

اشاره گر به چه درد می خورد؟

متغیرها چیزی نیستند جز خانه هایی از حافظه RAM. مثلا وقتی یک متغیر از نوع عدد صحیح یا int تعریف می کنیم، در زمان اجرای برنامه بخشی از حافظه ی RAM که متعلق به برنامه ی دیگر و متغیر دیگری نیست (آزاد است) به این عدد تخصیص می یابد. در این حالت که متغیر ما int است، 4 بایت از حافظه به این متغیر تخصیص داده می شود (چرا؟). هر خانه ی حافظه، آدرس منحصر به فردی دارد که در سیستم های 32 بیتی یک مقدار 32بیتی یا 4بایتی مثل 0x003245100 است(در مبنای هگز هر دو رقم بیانگر یک بایت است). در سیستمهای 64 بیتی آدرسها 64 بیتی اند یعنی چیزی شبیه به 0x0000000003245100. خوب حالا اشاره گر، چیزی! است که می تواند آدرس یک متغیر از هر نوعی را در خود نگه دارد.
اگر یک اشاره گر داشته باشیم، در واقع به آدرسهای مختلف حافظه (تا جایی که مجاز هستیم) می توانیم دسترسی پیدا کنیم. مهمترین استفاده اشاره گرها هم در کار با حافظه است، مخصوصا زمانی که قصد داریم حافظه ی زیادی تخصیص دهیم یا مرتبا حافظه بگیریم و آزاد کنیم. لیکن قبل از اینکه بیشتر شلوغش کنیم بهتره نحوه تعریف یک اشاره گر را ببینیم.

نحوه تعریف اشاره گر در سی پلاس پلاس

برای تعریف یک اشاره گر به نوع داده ی int به صورت زیر عمل می کنیم:

int *ptr;

حال می توانیم ادرس یک متغیر int را در این اشاره گر ذخیره کنیم، برای گرفتن آدرس یک متغیر کافیست قبل از نام آن از علامت & استفاده کنیم.

int x = 105;
ptr = &x;

اگر فرضا متغیر x در آدرس 0x00123456 از حافظه قرار داشته باشد، مقدار ptr برابر 0x00123456 خواهد شد.
برای اینکه محتوای یک آدرس حافظه را ببینیم باید از علامت * قبل از نام اشاره گر استفاده کنیم، مثلا با دستور زیر مقدار متغیر y برابر محتوای موجود در آدرس 0x00123456 خواهد شد که همان مقدار متغیر x است که در بالا تعریف شد:

int y = *ptr;

نکته ای که درباره اشاره گرها باید دقت کرد این است که برای تعریف هر اشاره گر باید حتما یک علامت * استفاده کنیم و این طور نیست که با روش مثل کد زیر بتوانیم 2 اشاره گر تعریف کنیم:

long* p1=0, p2 = 88; //what happens here?

در این کد در واقع ما یک اشاره گر و یک متغیر تعریف کرده ایم، درست مثل اینکه بنویسیم:

long *p1 = 0;
long p2 = 88;

اگربخواهیم دو اشاره گر در یک خط تعریف کنیم به صورت زیر عمل می کنیم:

long *p1=0, *p2 = 88; //the correct way of defining two pointers

اگر تا اینجای بحث را خوب متوجه شده باشید، 50% مبحث اشاره گرها را یاد گرفته اید.  اما اشاره گرها یک استفاده مهم دیگر هم دارند که آن عبارت است از تخصیص حافظه؛ چیزی شبیه کاری که یک آرایه می کند، لیکن بدون محدودیت!


نظرات شما عزیزان:

نام :
آدرس ایمیل:
وب سایت/بلاگ :
متن پیام:
:) :( ;) :D
;)) :X :? :P
:* =(( :O };-
:B /:) =DD :S
-) :-(( :-| :-))
نظر خصوصی

 کد را وارد نمایید:

 

 

 

عکس شما

آپلود عکس دلخواه:








تاريخ: یک شنبه 9 بهمن 1390برچسب:,
ارسال توسط sajad