& vs *
المراجع مقابل المؤشّرات & vs *
المرجع (Type&) اسم مستعار لمتغيّر موجود لا يمكن أن يكون فارغًا ولا يُعاد ربطه، بينما المؤشّر (Type*) عنوان ذاكرة يمكن أن يكون nullptr ويُعاد توجيهه.
كلاهما يسمح بالوصول لمتغيّر دون نسخه، لكن الفروقات الجوهرية تحدد متى تستخدم كل واحد: المرجع يجب تهيئته فور إعلانه ولا يمكن أن يشير لاحقًا لمتغيّر آخر (يبقى اسمًا مستعارًا لنفس المتغيّر طوال حياته)، ولا وجود لـ«مرجع فارغ». المؤشّر أكثر مرونة: يمكن أن يكون nullptr، ويمكن إعادة توجيهه لمتغيّر آخر، ويحتاج * لإلغاء الإشارة صراحة.
القاعدة العملية: استخدم المراجع (خصوصًا const T&) لمعاملات الدوال افتراضيًا لأنها أوضح وأأمن، واستخدم المؤشّرات فقط لما تحتاج فعليًا القدرة على تمثيل «لا شيء» (nullptr) أو إعادة التوجيه لاحقًا.
الصياغة
Type& ref = variable; // مرجع Type* ptr = &variable; // مؤشّر
📄 مثال
int x = 10; int& ref = x; // اسم مستعار لـ x نفسه int* ptr = &x; // عنوان x ref = 20; // x أصبح 20 أيضًا *ptr = 30; // x أصبح 30 أيضًا ptr = nullptr; // مسموح — المؤشّر يمكن أن يكون فارغًا // ref لا يمكن أبدًا أن تصبح nullptr أو تشير لمتغيّر آخر
أهم النقاط
| العنصر | الوظيفة |
|---|---|
| Type& (مرجع) | اسم مستعار إلزامي التهيئة، لا يمكن أن يكون فارغًا أو يُعاد ربطه |
| Type* (مؤشّر) | عنوان ذاكرة صريح، يمكن أن يكون nullptr ويُعاد توجيهه |
| const Type& | الخيار الافتراضي الموصى به لمعاملات الدوال — بلا نسخ وبلا تعديل |
💡 نصائح عملية
- مرّر الكائنات بمعاملات const T& افتراضيًا؛ استخدم T* فقط إن احتجت تمثيل غياب القيمة (nullptr) صراحة
- استخدم T& (بدون const) فقط لما تنوي تعديل المتغيّر الأصلي فعليًا من داخل الدالة
⚠️ أخطاء شائعة
- نسيان تهيئة مرجع فور إعلانه — خطأ ترجمة إلزامي، بعكس المؤشّر الذي يمكن تركه nullptr مؤقتًا
- عدم التحقق من nullptr قبل إلغاء إشارة مؤشّر (*ptr) — سلوك غير معرَّف يسبب أعطالًا مباشرة
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.