Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

المؤشرات والمراجع

جزء من قسم Object Oriented Programming في رحلة C++ على Coddy — الدرس 13 من 104.

الآن بعد أن فهمت ذاكرة الـ stack والـ heap، دعنا نستكشف الأدوات التي تتيح لك العمل مع مواقع الذاكرة مباشرةً: المؤشرات (pointers) والمراجع (references).

يقوم المؤشر بتخزين عنوان الذاكرة لمتغير آخر. تقوم بالتصريح عنه باستخدام * وتحصل على العنوان باستخدام &.

int value = 42;
int* ptr = &value;    // ptr يحمل عنوان value

std::cout << ptr;     // يطبع عنوان الذاكرة
std::cout << *ptr;    // إلغاء المرجعية: يطبع 42

الـ مرجع هو اسم مستعار لمتغير موجود بالفعل. وبمجرد ربطه، فإنه يشير دائماً إلى ذلك المتغير. يتم التصريح عنه باستخدام &.

int value = 42;
int& ref = value;     // ref هو اسم مستعار لـ value

ref = 100;            // يغير value إلى 100
std::cout << value;   // يطبع 100

الاختلافات الرئيسية:

المؤشرات (Pointers)المراجع (References)
يمكن أن تكون فارغة (null)يجب تهيئتها
يمكن إعادة تعيينهالا يمكن إعادة ربطها
استخدم * للوصول إلى القيمةالوصول إلى القيمة مباشرة
يمكن أن تشير إلى لا شيءصالحة دائماً

كلاهما ضروري لتمرير الكائنات إلى الدوال بكفاءة دون نسخها، وللعمل مع الذاكرة المخصصة في الكومة (heap). المراجع أكثر أماناً وبساطة، بينما توفر المؤشرات مرونة أكبر عندما تحتاج إلى إعادة التعيين أو التحقق من القيمة الفارغة (null).

challenge icon

التحدي

سهل

لنقم ببناء نظام بسيط للتلاعب بالقيم يوضح كيف تعمل المؤشرات (pointers) والمراجع (references) بشكل مختلف عند تعديل البيانات.

ستقوم بإنشاء ملفين لتنظيم الكود الخاص بك:

  • ValueOps.h: قم بتعريف ثلاث دوال تقوم بتعديل قيم الأعداد الصحيحة بطرق مختلفة:
    • doubleByPointer(int* ptr) — تأخذ مؤشراً وتضاعف القيمة التي يشير إليها.
    • tripleByReference(int& ref) — تأخذ مرجعاً وتضاعف القيمة ثلاث مرات.
    • swapValues(int* a, int* b) — تأخذ مؤشرين وتقوم بتبديل القيم التي يشيران إليها.
  • main.cpp: اقرأ عددين صحيحين من المدخلات، ثم استعرض كلاً من المؤشرات والمراجع:
    • اطبع القيم الأصلية: "Original: <first> <second>"
    • استخدم doubleByPointer على القيمة الأولى، ثم اطبع: "After double: <first>"
    • استخدم tripleByReference على القيمة الثانية، ثم اطبع: "After triple: <second>"
    • استخدم swapValues لتبديل كلتا القيمتين، ثم اطبع: "After swap: <first> <second>"

عند استدعاء الدوال باستخدام المؤشرات، تذكر استخدام عامل العنوان (&) لتمرير عنوان المتغير. أما المراجع فتعمل بشكل طبيعي أكثر — فقط قم بتمرير المتغير مباشرة.

قم بتضمين ملف الرأس الخاص بك في main.cpp باستخدام #include "ValueOps.h".

ورقة مرجعية

يخزن المؤشر (pointer) عنوان الذاكرة لمتغير آخر. يتم التصريح عنه باستخدام * والحصول على العنوان باستخدام &:

int value = 42;
int* ptr = &value;    // ptr holds the address of value

std::cout << ptr;     // Prints the memory address
std::cout << *ptr;    // Dereference: prints 42

أما المرجع (reference) فهو اسم مستعار لمتغير موجود بالفعل. يتم التصريح عنه باستخدام &:

int value = 42;
int& ref = value;     // ref is an alias for value

ref = 100;            // Changes value to 100
std::cout << value;   // Prints 100

الاختلافات الجوهرية:

المؤشرات (Pointers)المراجع (References)
يمكن أن تكون فارغة (null)يجب تهيئتها عند الإعلان عنها
يمكن إعادة تعيينها لمتغير آخرلا يمكن تغيير ارتباطها بمتغير آخر
استخدم * للوصول إلى القيمةالوصول إلى القيمة مباشرة
يمكن ألا تشير إلى شيءدائماً صالحة

عند استدعاء الدوال باستخدام المؤشرات، استخدم عامل العنوان (&) لتمرير عنوان المتغير. أما المراجع فتعمل مباشرة — فقط قم بتمرير المتغير.

جرّب بنفسك

#include <iostream>
#include "ValueOps.h"
using namespace std;

int main() {
    // قراءة عددين صحيحين من المدخلات
    int first, second;
    cin >> first;
    cin >> second;
    
    // طباعة القيم الأصلية
    cout << "Original: " << first << " " << second << endl;
    
    // TODO: استخدم doubleByPointer على القيمة الأولى (مرر العنوان باستخدام &)
    
    // TODO: الطباعة بعد المضاعفة (double)
    
    // TODO: استخدم tripleByReference على القيمة الثانية (مرر المتغير مباشرة)
    
    // TODO: الطباعة بعد المضروب في ثلاثة (triple)
    
    // TODO: استخدم swapValues لتبديل القيمتين (مرر العناوين باستخدام &)
    
    // TODO: الطباعة بعد التبديل (swap)
    
    return 0;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming