PDA

View Full Version : سوال: چرا از اشاره گر ها استفاده می کنیم؟



complexcoding
پنج شنبه 16 شهریور 1391, 11:12 صبح
با سلام
چرا از اشاره گرها استفاده می کنیم در صورتی که می توانیم از خود متغیر و مقدار درون آن به صورت مستقیم استفاده کنیم کما اینکه در سی شارپ هم همین کار و می کنیم؟

maktoom
پنج شنبه 16 شهریور 1391, 11:59 صبح
سلام
سوال شما تیتر برخی فصل های خیلی از کتب آموزش برنامه نویسیه. برای گرفتن جواب بهتر به اونها مراجعه داشته باشید.

soorena
پنج شنبه 16 شهریور 1391, 13:30 عصر
اشاره گر‌ها به ما کمک میکنند تا خیلی‌ جاها سربار ناشی‌ از کپی کردن یه داده رو حذف کنیم و از اشغال بی‌ مورد حافظه جلوگیری می‌کنن ضمن اینکه این‌ها باعث می‌شه تا سرعت اجرای برنامه هم بیشتر بشه.

ضمنا در سی‌ شارپ و جاوا هم اشاره گر‌ها وجود دارن و شما دائم در حال استفاده از اونا هستین ولی‌ خودتون متوجه نمیشین چون مدیریت اونها با خود زبان هستش وگرنه تا جایی‌ که من یادمه در سی‌ شارپ تمام متغیر‌ها که در اصل یک نمونه از یک کلاس هستند به صورت اشاره گر به شی‌ تعریف میشن.

حامد مصافی
جمعه 17 شهریور 1391, 14:53 عصر
افزون بر فرمایشات دوستان:
در سی‌شارپ همین کار رو نمی‌کنیم!
در سی‌شارپ ما از متغیر استفاده می‌کنیم اما دات‌نت در پس‌زمینه برخی اوقات از مکانیزم اشاره‌گر استفاده می‌کنه

cpppro
جمعه 17 شهریور 1391, 20:18 عصر
تو سی شارپ اشاره گرها با نام Unsafe Code شناخته میشن.
میتونین همین قسمت رو تو کتاب C#‎ in a Nutshell مطالعه کنین.

C#‎ supports direct memory manipulation via pointers within blocks of code marked
unsafe and compiled with the /unsafe compiler option. Pointer types are primarily
useful for interoperability with C APIs, but may also be used for accessing memory
outside the managed heap or for performance-critical hotspots.

یه مثال :
unsafe void BlueFilter (int[,] bitmap)
{
int length = bitmap.Length;
fixed (int* b = bitmap)
{
int* p = b;
for (int i = 0; i < length; i++)
*p++ &= 0xFF;
}
}
Unsafe code can run faster than a corresponding safe implementation. In this case,
the code would have required a nested loop with array indexing and bounds checking.
An unsafe C#‎ method may also be faster than calling an external C function,
since there is no overhead associated with leaving the managed execution
environment

Alireza_1387
سه شنبه 21 شهریور 1391, 17:42 عصر
از اوجایی که اشاره گرها به آدرس اشاره می کنند
تابع برای استفاده از محتویات به همون آدرس مراجعه می کنند
ولی برای استفاده مستقیمی که شما می گید(که غیر مستقیم هستش)
در واقع تابع از متغیر یه کپی می گیره و سپس از اون استفاده می کنه
اما وقتی از اشاره گر استفاده بشه
به معنای واقعی خود محتویات اشاره گر مورد تغییر قرار می گیره و اگه
در آخر محتویات اشاره گر رو چاپ کنید می بینید که محتویات اشاره گر توسط تابع تغییر کرده
ولی بدون استفاده از شاره گر ، محتویات دست نخورده باقی می ماند

IamOverlord
شنبه 25 شهریور 1391, 15:29 عصر
سلام...
در زبان های شئ گرا یکی از روش های پیاده سازی رشته ها به این صورته که یه int تعریف می کنن که طول رشته رو نگه داره و یه اشاره گر به رشته ی اصلی... فرض کنید می خواید آرایه ای از رشته ها داشته باشید... چی کار می کنید؟ راهش اینه که اون آرایه حاوی اشاره گر هایی به رشته ها باشه، نه حاوی رشته ها پشت سر هم...
یا مثلا ++C چه طوری توابع و زیربرنامه های کلاس ها رو پیاد سازی می کنه؟ به روالی که داخل کلاس تعریف کردید یه آرگومان دیگه اضافه می کنه که اشاره گری به یه struct هست، اون struct هم هر وقت که شئ جدیدی از اون کلاس ایجاد می کنید ساخته می شه... یعنی متغیر ها کپی می شن به صورت struct، اما روال ها کپی نمی شن و به جاش از اشاره گر به struct استفاده می شه...
و خیلی کاربرد های مهم دیگه...

mr AHR
پنج شنبه 30 شهریور 1391, 17:34 عصر
در بین عزیزان احساس خجالت و حقارت میکنم و اصلا صاحب نظر هم نیستم ولی خوب بیکاریه دیگه !!!
یه وقتی هست شما مینویسی
int a;
یه وقتی هست مینویسی
int *b;
تو حالت عادی استفاده از پوینتر ( یا اصلا ریفرنس ) برای داده های کوچیک فقط دردسر داره !
ولی فکر کن به جای int یک آرایه 1000000000 عضوی داری ! حالا مهم میشه که بدونی اولیه ارور میده ولی دومی تازه گرم میشه ! چرا !
دلیلش اینه که مموری مربوط به برنامه شما هنگام اجرا به چنر بخش تقسیم میشه دوبخش مهمش Stack و Heap هستن
Stack کارش اینه که متغیرهای Local تابع در حال اجرا و همچنین اطلاعات مربوط به Call ها رو نگه داره و معمولا حدود 1 مگ هست ( اطلاعات بیشتر اینجا (http://www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/)) ! در حالی که Heap اساسا کش میاد و به این راحتی ها تموم نمیشه ! نکته اینجاست که اگر هر کدوم از این دوتا پر شه برنامه به فنا میره !
به نظرت کدوم زود تر پر میشه ! آورین ، Stack .
وقتی از حالت اوّل استفاده کنی تو Stack تعریف کردی و در حالت دوم تو Heap جا گرفتی و یه پوینتر ( معمولا 4 بایتی ) تو Stack رو به طرفش نشونه رفتی ! که باعث میشه مشکل جا نداشته باشی .
حالا دلیل مشکل اوّلیرو وقتی آرایه‌‎ی 1000000000 عضوی داشتیم هم فهمیدی احتمالا ! بله Stack پر میشه !
به این حالت میگن Stack Overflow .