🔥 أحدث الأخبار

موقع يهتم بكل ماهو جديد في عالم التكنولوجيا والرياضة

الحلقة السابعة في تعلم C++: المؤشرات (Pointers)

 


الحلقة السابعة في تعلم C++: المؤشرات (Pointers)

#برمجة

مقدمة

مرحباً بك في الحلقة السابعة من سلسلة تعلم C++ للمبتدئين.

في الحلقات السابقة تعلمنا:

  • المتغيرات وأنواع البيانات
  • الشروط
  • الحلقات
  • الدوال
  • المصفوفات
  • النصوص (Strings)

واليوم سندخل إلى واحد من أهم وأقوى مفاهيم C++:

المؤشرات (Pointers)


ما هو المؤشر؟

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

بمعنى:

  • المتغير العادي يخزن قيمة
  • المؤشر يخزن مكان هذه القيمة في الذاكرة

مثال بسيط جداً

int x = 10;
int* p = &x;

الشرح:

  • x = قيمة عادية
  • &x = عنوان x في الذاكرة
  • p = مؤشر يخزن عنوان x

لماذا نستخدم المؤشرات؟

المؤشرات مهمة جداً لأنها تستخدم في:

  • إدارة الذاكرة
  • تحسين أداء البرامج
  • التعامل مع المصفوفات
  • بناء هياكل البيانات
  • الألعاب والأنظمة

كيف نطبع عنوان المتغير؟

#include <iostream>
using namespace std;

int main()
{
    int x = 10;

    cout << &x;

    return 0;
}

كيف نطبع قيمة المؤشر؟

#include <iostream>
using namespace std;

int main()
{
    int x = 10;
    int* p = &x;

    cout << *p;

    return 0;
}

ملاحظة مهمة:

  • *p تعني الوصول للقيمة
  • &x تعني الوصول للعنوان

الفرق بين * و &

الرمز المعنى
& عنوان المتغير
* القيمة داخل العنوان

مثال عملي مهم

#include <iostream>
using namespace std;

int main()
{
    int a = 5;
    int* p = &a;

    cout << "Address: " << p << endl;
    cout << "Value: " << *p;

    return 0;
}

تعديل القيمة عبر المؤشر

#include <iostream>
using namespace std;

int main()
{
    int x = 10;
    int* p = &x;

    *p = 20;

    cout << x;

    return 0;
}

النتيجة:

20

شرح مهم جداً

عندما تكتب:

*p = 20;

أنت لا تعدل المؤشر، بل تعدل القيمة الأصلية نفسها.


المؤشرات مع المصفوفات

المصفوفات مرتبطة مباشرة بالمؤشرات.

#include <iostream>
using namespace std;

int main()
{
    int arr[3] = {10, 20, 30};

    cout << arr << endl;
    cout << *arr << endl;

    return 0;
}

الوصول لعناصر المصفوفة بالمؤشر

#include <iostream>
using namespace std;

int main()
{
    int arr[3] = {10, 20, 30};

    int* p = arr;

    cout << *(p + 0) << endl;
    cout << *(p + 1) << endl;
    cout << *(p + 2) << endl;

    return 0;
}

مثال باستخدام loop

#include <iostream>
using namespace std;

int main()
{
    int arr[5] = {1,2,3,4,5};
    int* p = arr;

    for(int i = 0; i < 5; i++)
    {
        cout << *(p + i) << endl;
    }

    return 0;
}

المؤشرات والدوال

يمكن تمرير العناوين للدوال.

#include <iostream>
using namespace std;

void changeValue(int* p)
{
    *p = 100;
}

int main()
{
    int x = 10;

    changeValue(&x);

    cout << x;

    return 0;
}

لماذا هذا مهم؟

لأنه يسمح للدوال بتعديل القيم الأصلية مباشرة.


مثال swap (تبديل قيمتين)

#include <iostream>
using namespace std;

void swap(int* a, int* b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main()
{
    int x = 5, y = 10;

    swap(&x, &y);

    cout << x << " " << y;

    return 0;
}

النتيجة:

10 5

المؤشرات NULL

المؤشر الفارغ يعني لا يشير لأي مكان.

int* p = NULL;

لماذا NULL مهم؟

حتى نتجنب أخطاء البرنامج (Crash).


مثال خطأ شائع

int* p;
cout << *p;

⚠️ هذا خطير لأنه يشير لمكان عشوائي في الذاكرة.


المؤشرات الحديثة (nullptr)

int* p = nullptr;

مثال عملي: جمع باستخدام المؤشرات

#include <iostream>
using namespace std;

int sum(int* a, int* b)
{
    return *a + *b;
}

int main()
{
    int x = 10, y = 20;

    cout << sum(&x, &y);

    return 0;
}

أخطاء شائعة

❌ نسيان * عند الوصول للقيمة
❌ استخدام مؤشر غير مهيأ
❌ التعامل مع ذاكرة غير موجودة
❌ الخلط بين & و *


تمارين

  1. اطبع قيمة متغير باستخدام مؤشر
  2. غيّر قيمة متغير عبر مؤشر
  3. اصنع دالة swap
  4. اطبع عناصر مصفوفة باستخدام المؤشرات

ملخص الحلقة السابعة

في هذه الحلقة تعلمنا:

  • ما هي المؤشرات
  • & و *
  • التعامل مع الذاكرة
  • المؤشرات مع المصفوفات
  • المؤشرات مع الدوال
  • swap
  • nullptr

في الحلقة الثامنة سنتعلم:

🔥 البرمجة الكائنية (OOP) في C++
وهي أهم خطوة نحو البرمجة الاحترافية وبناء التطبيقات الكبيرة والألعاب ان شاءالله 




تعليقات

💬 🙋🏻‍♂️