تفاوتهای عمده:
حالتهایی پایهای
۱) ارجاع (رفرنس) نمیتونه null
باشه ولی اشارهگر میتونه. بنابراین اگه میخواین حالت null
رو هم پشتیبانی کنین از اشارهگر استفاده کنین. مثلاً در حالتی که مقدار پیشفرض null
دارین:
int f(int *p = null);
۲) ارجاع نمیتونه در تابع دستکاری بشه اما اشارهگر میتونه:
int f(int *p)
{
p++;
}
که البته در این حالت اگه آرگومان const pointer
باشه میتونین از ارجاع استفاده کنین.
۳) عملیات ریاضی روی اشارهگر قابل اجراست مثلاً
int f(int *p1, int *p2)
{
if(p1 < p2) ...
}
که البته این کار توسط ارجاع هم قابل پیادهسازی هست که البته با اشارهگر راحتتره.
به جز این سه مورد استفاده از اشارهگر مزیتی نسبت به ارجاع نداره.
حالتهای پیچیدهتر
یه مورد پیچیدهتر هست که یک اشارهگر با نوع پویا (دینامیک) داشته باشیم. یعنی فرض کنیم کلاس P
والد و کلاس C
فرزند باشه و یه اشارهگر به والد رو به تابع بفرستیم که قراره در تابع به یک شی از نوع فرزند اشاره کنه. در این حالت استفاده از ارجاع برای چنین کاری انتخاب خوبی نیست.
هیچ پژوهش انسانی نمیتواند ادعای علمی بودن داشته باشد، مگر اینکه از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)