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

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

جزء من قسم البرمجة كائنية التوجه في رحلة C++ على Coddy. الدرس 13 من 104.

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

يخزّن pointer عنوان memory لمتغير آخر. تُصرّح عنه باستخدام * وتحصل على عنوان باستخدام &.

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

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

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

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

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

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

PointersReferences
يمكن أن تكون قيمة فارغةيجب تهيئتها
يمكن إعادة تعيينهالا يمكن إعادة ربطها
استخدم * للوصول إلى القيمةالوصول إلى القيمة directly
يمكن أن تشير إلى لا شيءصالحة دائمًا

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

challenge icon

التحدي

سهل

لنَبْنِ نظامًا بسيطًا لمعالجة القيم يوضّح كيفية اختلاف عمل المؤشرات والمراجع عند تعديل البيانات.

ستنشئ ملفين لتنظيم التعليمات البرمجية:

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

عند استدعاء الدوال باستخدام المؤشرات، تذكّر استخدام عامل address-of (&) لتمرير عنوان المتغير. تعمل المراجع بصورة طبيعية أكثر؛ ما عليك سوى تمرير المتغير directly.

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

جرّب بنفسك

#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: اطبع بعد المضاعفة
    
    // TODO: استخدم tripleByReference على القيمة الثانية (مرر المتغير مباشرة)
    
    // TODO: اطبع بعد التثليث
    
    // TODO: استخدم swapValues لتبديل كلتا القيمتين (مرر العناوين باستخدام &)
    
    // TODO: اطبع بعد التبديل
    
    return 0;
}
quiz iconاختبر نفسك

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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم C++ عبر الإنترنت