الحلقة السابعة في تعلم 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;
}
أخطاء شائعة
❌ نسيان * عند الوصول للقيمة
❌ استخدام مؤشر غير مهيأ
❌ التعامل مع ذاكرة غير موجودة
❌ الخلط بين & و *
تمارين
- اطبع قيمة متغير باستخدام مؤشر
- غيّر قيمة متغير عبر مؤشر
- اصنع دالة swap
- اطبع عناصر مصفوفة باستخدام المؤشرات
ملخص الحلقة السابعة
في هذه الحلقة تعلمنا:
- ما هي المؤشرات
- & و *
- التعامل مع الذاكرة
- المؤشرات مع المصفوفات
- المؤشرات مع الدوال
- swap
- nullptr
في الحلقة الثامنة سنتعلم:
🔥 البرمجة الكائنية (OOP) في C++
وهي أهم خطوة نحو البرمجة الاحترافية وبناء التطبيقات الكبيرة والألعاب ان شاءالله

تعليقات
إرسال تعليق