اولین بار است که به این وب‌سایت می‌آیید. راهنما را مطالعه کنید!
x
موسسه خیریه محک

شهر ریاضی بازی-ریاضی

ارجاع در مقایسه با اشاره‌گر

+1 امتیاز
112 نمایش

وقتی میخواهیم به یک تابع اصل متغیر را بفرستیم، کدام یک از این دو بهتر است که مورد استفاده قرار بگیرد؟


unsigned long x = 4; void func1(unsigned long& val) {
val = 5;
}
func(x);

یا

void func2(unsigned long* val) {
*val = 5;
}
func2(&x);

و آیا دلیل خاصی برای انتخاب یکی از این دو وجود دارد؟
در ++C زبانی بسیار کوچک‌تر و پاکیزه‌تر در تلاش برای خروج است. (Bjarne Stroustrup)
پرسیده شده چهارشنبه ۱ آذر ۱۳۹۱ در C++ توسط برنامه‌نویس  
بازتگ شده پنجشنبه ۲۲ فروردین ۱۳۹۲ توسط admin

2 پاسخ

0 امتیاز
 
بهترین پاسخ

اشاره‌گر خصوصیات بیشتری نسبت به ارجاع در دسترس برنامه‌نویس قرار می‌ده که اگه حتماً به این خصوصیات نیاز دارید از اشاره‌گر استفاده کنین در غیر این صورت از ارجاع.

۱) اشاره‌گر می‌تونه NULL باشه و NULL بودنش قابل بررسی هست. مثلاً فرض کنید که تابع f قراره با یه متغیر فراخوانی بشه. متغیر قراره در تابع تغییر کنه. بنابراین باید از اشاره‌گر یا ارجاع استفاده بشه. فرض کنید کاربر می‌تونه متغیر رو به تابع نده و در این صورت تابع خودش یه متغیر تولید کنه.

int* f(int *ptr = NULL)
{
  if(ptr == NULL)
    return new int(0);
  *ptr = 2*(*ptr) + 1;
  return NULL;
}

حالا تابع main رو داریم

int main()
{
  int x, *p1, *p2;
  f(&X);
  p1 = f(p2);
}

این که استفاده‌های پیچیده‌ای مثل این به ندرت اتفاق می‌افته درسته ولی به هرحال گاهی لازمه.

۲) اشاره‌گر می‌تونه تغییر کنه. یعنی داخل تابع می‌تونین خود اشاره‌گر رو تغییر بدین.

تابعی داریم که مقادیر یک آرایه رو تا وقتی به عدد خاصی برسیم چاپ می‌کنه

void f(int *ptr, int x)
{
  while(*(ptr++) != x) cout<<*ptr<<" ";
}

این کار با ارجاع کمی کد بیشتری نیاز داره در برخی مواقع

در غیر این دو صورت همیشه از ارجاع استفاده کنین. چرا؟

۱) ارجاع در فراخوانی کد خواناتری تولید می‌کنه. (f(x) به جای ‍f(&x))
۲) ارجاع امکان دسترسی ناخواسته به آدرس‌های غیرمجاز رو کمتر می‌کنه.

هیچ پژوهش انسانی نمی‌تواند ادعای علمی بودن داشته باشد، مگر این‌که از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)
پاسخ داده شده شنبه ۱۸ خرداد ۱۳۹۲ توسط prodo  
انتخاب شده شنبه ۱۸ خرداد ۱۳۹۲ توسط admin
0 امتیاز

قانون من برا استفاده از اینها اینه:
از اشاره‌گر استفاده کن هروقت محاسباتی روشون باید انجام بدی، و یا هر وقت که باید اشاره‌گری به null بفرستی.
در بقیه موارد از رفرنس استفاده کن.

پاسخ داده شده پنجشنبه ۲ آذر ۱۳۹۱ توسط CPP_Answer_Machine2