خوراک پی سی کدنویس

ورود کاربران

آمار سایت

اعضا : 380
محتوا : 74
پیوندها : 6
بازدیدهای محتوا : 217775

حاضرین در سایت

 27 مهمان حاضر

برای نمایش بهتر سایت، از مرورگر استاندارد فایرفاکس استفاده کنید! مرورگر اینترنت اکسپلورر متعلق به دهه گذشته است!

firefox icon

Valid XHTML 1.0 Transitional Valid CSS!

اشاره گرها در سی پلاس پلاس | C++ Pointers

8 امتیاز

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

اشاره گر که معادل فارسی لغت 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% مبحث اشاره گرها را یاد گرفته اید.  اما اشاره گرها یک استفاده مهم دیگر هم دارند که آن عبارت است از تخصیص حافظه؛ چیزی شبیه کاری که یک آرایه می کند، لیکن بدون محدودیت!

برای اینکه این مبحث را یاد بگیرید، منتظر مقاله بعدی باشید.

  • دانشجو
    avatar
    سلام...استاد ممکنه لطف کنید مطالبی رو که سر کلاس عنوان می کنید تو سایت قرار بدید؟مثلاpower point ها،برنامه هایی که سرکلاس توضیح میدیدوپاسخ تمرین های کلاسی....ممنون میشم ....
  • مدیر سایت  - پاسخ
    avatar
    سلام
    قصد بر همینه و سعی می کنم که مطالب گفته شده در کلاس را در اینجا قرار دهم. لیکن پاسخ تمرینها را ترجیحا برای دانشجویان میل خواهم کرد. چرا که برای آیندگان هم این تمرینات لازم خواهد بود!
    برای اینکه آدرس ایمیل شما را داشته باشم، در سایت ثبت نام کنید.
    http://www.p30codenevis.ir/registration.html
  • حامد پورآزاد
    avatar
    ببخشيد استاد براي اينكه به يك متغير اشاره گر با دستور cin يك مقدار بدهيم بايد از يك متغير ديگر استفاده كنيم يا به اين شكل:
    pFact*
  • حامد پورآزاد  - re:
    avatar
    ببخ[quote=حامد پورآزاد]ببخشيد استاد براي اينكه به يك متغير اشاره گر با دستور cin يك مقدار بدهيم بايد از يك متغير ديگر استفاده كنيم يا به شكل عادي ورود متغير بنويسيم؟
    آخر برنامه من اشكال مي گيرد.
  • مدیر سایت  - متغیر و اشاره گر
    avatar
    اشاره گر به خودی خود فقط یک آدرس است و مادامیکه به جای درستی اشاره نکند نمی توان از ptr* استفاده کرد. لیکن اگر آدرس درستی داشته باشد ptr* دقیقا مثل یک متغیر است:
    int *ptr = new int;
    cin >> *ptr;
  • جعفر  - خواهش
    avatar

    :( گفتيد خوب هم گفتد ليكن نامفهوم است اگر مي توانيد خيلي راحت به زبان خودماني توضيح دهيد و بگوييد كه با اشاره گرها مي توان سرعت الگوريتم را افزايش داد يا نه؟
    ممنون از اين همه لطف
    اگه ممكنه چندتا مقاله و مثال هم به آدرس ايميلم بفرستيد.
  • مدیر سایت  - @جعفر
    avatar
    سلام
    شما مقاله زیر را هم مطالعه کنید، انشاءالله کفایت می کند:
    http://p30codenevis.ir/cpp-programming/99-memory-assignment-using-n...
    در مورد افزایش سرعت الگوریتمها، مسلما بله. زمانیکه با حجم زیادی از حافظه سروکار داریم مثلا در برنامه های پردازشی استفاده ی درست از اشاره گر بسیار راه گشاست.
    مثلا در کار با تصاویر دستوراتی هست که اطلاعات پیکسلها را می دهد، لیکن کند هستند. در اینجا اگر بافر تصویر را به دست آورده و با اشاره گر روی آن حرکت کنیم الگوریتم ما بسیار سریعتر خواهد شد. همین طور است در کار با سایر فایلهای باینری.
    مثالهای پردازش تصویری که در همین سایت قرار گرفته نحوه کار را بیان می کند.
  • ناشناس
    avatar
    :woohoo: مرسی من 3 ساعت دیگه امتحان دارم مطالبتون خیلی به دردم خورد موفق باشید
  • میلاد  - نظر
    avatar
    سلام - خسته نباشید
    مختصر و مفید بود !
    با تشکر
  • بهار  - تشكر
    avatar
    بابت مطالب مفيدتون تشكر
    اجرت باامام حسين
  • حسن  - تشکر
    avatar
    بسیار عالی بود. :woohoo:
  • دخی  - تشکر
    avatar
    خیلی خیلی ممنون مفید و گویا بود
اظهار نظر
مشخصات شما:
گراواتار enabled
نظر:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):s:!::?::idea::arrow:
امنیت
کد آنتی اسپم نمایش داده شده در عکس را وارد کنید.