البرمجة

فهم الفارق بين المراجع والمؤشرات في C++

في لغة البرمجة C++, تعمل المراجع (Reference variables) والمؤشرات (Pointers) على تمثيل وصول مباشر إلى العناصر في الذاكرة. ولكن هناك اختلاف بين int &y = x و int y = &x.

في البداية، int &y = x تعني أننا قد أنشأنا مرجعًا يشير إلى نفس المكان الذي يشير إليه المتغير x. هذا يعني أن y هو اسم آخر لنفس المتغير x. بمعنى آخر، أي تغيير في قيمة x سيؤدي إلى تغيير مباشر في قيمة y، والعكس صحيح.

أما int y = &x، فهذا غير صحيح بل يحدث خطأ لأن y هو متغير عادي وليس مؤشرًا، ولا يمكن تخزين عنوان في متغير عادي مثلما يمكن في المؤشرات.

الكود الذي قدمته يحتوي على سطور *s++; و q++;، حيث يمكن أن تكون هناك بعض الالتباسات. في البداية، q++; يقوم بزيادة قيمة المتغير p بواحد، وهذا ينعكس على q أيضًا لأنه مرجع لـ p.

أما *s++;، فإن s++ يزيد عنوان المتغير p في الذاكرة بمقدار حجم النوع (int في هذه الحالة)، ولكن *s يحاول الوصول إلى المحتوى في العنوان القديم، قبل زيادة s. لتحقيق النتيجة المتوقعة، يمكن استخدام (*s)++ بدلاً من *s++.

الناتج الذي تحصل عليه (6422280) هو العنوان الجديد في الذاكرة بعد زيادة s، وليس قيمة المحتوى. لذا، يمكن تعديل الكود كما يلي:

cpp
#include using namespace std; int main() { int p = 10; int &q = p; // q is a reference variable to p // int r = &p; // error: invalid conversion from 'int*' to 'int' int *s = &p; // valid q++; (*s)++; // Increment the value pointed to by s cout << p << endl << q << endl << *s; }

الناتج الآن سيكون:

12 12 12

في الختام، يجب فهم أن المراجع والمؤشرات لها استخدامات مختلفة وتفاصيل في لغة البرمجة C++، ومن المهم فهم تلك الاختلافات لتجنب الالتباسات وتحقيق النتائج المرجوة.

المزيد من المعلومات

بالطبع، دعونا نقوم بتوسيع النقاش حول المراجع والمؤشرات في لغة البرمجة C++، ونتعمق في بعض المفاهيم الأساسية والتقنيات المتعلقة.

المراجع (Reference Variables):

المراجع هي آلية تسمح بإعطاء اسم آخر لمتغير موجود، وهي تُستخدم لإنشاء "مرادف" لمتغير آخر. تتمثل الميزة الرئيسية للمراجع في أنها لا تخلق مكانًا جديدًا في الذاكرة، بل تشير فقط إلى نفس الموقع الذي تشير إليه المتغير الأصلي. عندما يتم تغيير المتغير الأصلي، يتغير المرجع أيضًا بشكل مباشر.

المؤشرات (Pointers):

المؤشرات هي متغيرات تخزن عناوين في الذاكرة، وهي تُستخدم للوصول إلى البيانات المخزنة في تلك العناوين. يُعبِر عن المؤشر بواسطة الرمز '*'، ويمكن استخدامه للتأشير على القيمة التي يشير إليها المؤشر.

فهم *s++:

في الكود الذي قدمته، *s++ يحتوي على عاملين. أولاً، s++ يزيد قيمة المؤشر s بحجم نوع البيانات (في هذه الحالة، int). ثانياً، *s يستخدم للوصول إلى المحتوى في العنوان الجديد الذي تم زيادة s إليه. ومن ثم، تتغير قيمة المحتوى.

التفاوت بين المراجع والمؤشرات:

  1. تغيير الهدف:

    • المراجع تُعد "مرادفًا" للمتغير الأصلي وتتبع تغييراته بشكل مباشر.
    • المؤشرات تشير إلى مواقع في الذاكرة وتستخدم للوصول إلى القيم في تلك المواقع.
  2. تعريف واستخدام:

    • المراجع يتم تعريفها باستخدام الرمز & وتستخدم لإنشاء "مرادف" لمتغير موجود.
    • المؤشرات تعرف باستخدام الرمز * وتستخدم لتخزين والتلاعب بعناوين في الذاكرة.

الكود المعدل:

cpp
#include using namespace std; int main() { int p = 10; int &q = p; // q is a reference variable to p int *s = &p; // s is a pointer storing the address of p q++; (*s)++; // Increment the value pointed to by s cout << "p: " << p << endl; cout << "q: " << q << endl; cout << "*s: " << *s << endl; cout << "Address of p: " << &p << endl; }

المخرجات المتوقعة:

makefile
p: 12 q: 12 *s: 12 Address of p: [عنوان في الذاكرة]

تحليل المخرجات يظهر أن المتغيرات p و q و *s تحتوي جميعها على القيمة 12 بعد التعديل، مما يظهر فهمًا صحيحًا للتفاعل بين المراجع والمؤشرات في الكود.

زر الذهاب إلى الأعلى