مراجعة مؤشرات Void
جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 49 من 61.
إن void* هي طريقة C للقول: "مؤشر إلى شيء ما، لكنني لن أخبرك ما هو." ويمكنها الاحتفاظ بعنوان أي نوع من البيانات: int أو float أو بنية أو أي شيء آخر. وهذا ما يجعلها أساس كتابة تعليمات برمجية عامة في C.
لكن المشكلة هي أنه لا يمكنك إلغاء الإشارة إلى void* مباشرةً. فالمصرّف لا يعرف عدد البايتات التي يجب قراءتها أو كيفية تفسيرها. ولاستخدام البيانات، يجب تحويلها مرة أخرى إلى النوع الصحيح:
void print_int(void* data) {
int* p = (int*)data;
printf("%d\n", *p);
}
int main() {
int x = 42;
print_int(&x);
return 0;
}تأتي هذه المرونة مصحوبة بالمسؤولية. فإذا حوّلت المؤشر إلى النوع الخطأ، فلن يمنعك المصرّف، لكن برنامجك سينتج بيانات تالفة أو سيتعطّل. ولهذا السبب، غالبًا ما تقترن function العامة بـ void* ومؤشر نوع (مثل تعداد أو flag) حتى تعرف function كيفية تفسير data بشكل صحيح.
في الدروس القادمة، ستستخدم void* لبناء حاويات يمكنها تخزين أي نوع من data، مما يتيح إنشاء هياكل data قابلة لإعادة الاستخدام حقًا.
التحدي
سهلاكتب function تُسمى print_value وتقبل معاملين: مؤشر void* إلى data وراية type من نوع int. ينبغي أن تفسّر function البيانات وتطبعها استنادًا إلى راية type:
- إذا كانت راية type هي
0، فحوّل pointer إلىint*واطبع قيمة العدد الصحيح - إذا كانت راية type هي
1، فحوّل pointer إلىfloat*واطبع قيمة العدد العشري مع منزلتين عشريتين
سيستقبل برنامجك مدخلين:
- راية type (
0للعدد الصحيح،1للعدد العشري) - قيمة عددية
استنادًا إلى راية type، خزّن القيمة في variable من النوع المناسب، ثم استدعِ print_value مع pointer إلى ذلك المتغير وراية type.
ناتج المثال عندما تكون المدخلات 0 و42:
42ناتج المثال عندما تكون المدخلات 1 و3.14:
3.14ناتج المثال عندما تكون المدخلات 0 و-17:
-17ناتج المثال عندما تكون المدخلات 1 و99.5:
99.50جرّب بنفسك
#include <stdio.h>
// TODO: اكتب دالة print_value الخاصة بك هنا
int main() {
int type_flag;
scanf("%d", &type_flag);
if (type_flag == 0) {
int int_value;
scanf("%d", &int_value);
// TODO: استدعِ print_value مع مؤشر إلى int_value وعلامة النوع
} else if (type_flag == 1) {
float float_value;
scanf("%f", &float_value);
// TODO: استدعِ print_value مع مؤشر إلى float_value وعلامة النوع
}
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات البرمجة التركيبية
ملفات الترويسةحواجز التضمينملفات المصدرالدوال الساكنةمراجعة: آلة حاسبة تركيبية4التغليف (Encapsulation)
مفهوم الـ Opaque Pointersتعريف الـ Opaque Structsالـ Getters والـ Settersالتحقق من البيانات في الـ Settersملخص: الصندوق السري2الكائنات والأساليب
الـ Structs ككائناتمؤشر 'Self'صحة استخدام Constالمؤشر مقابل القيمةالأساليب المساعدةملخص: Point Manager5مشروع: حساب بنكي بسيط
إعداد المشروعتنفيذ الحساب3دورة حياة الكائن
نمط المنشئ (Constructor Pattern)نمط الهادم (Destructor Pattern)تهيئة الـ Stackالنسخ العميق (Deep Copy)مراجعة: String Wrapper6الوراثة عبر التركيب
تضمين الـ Structقاعدة العضو الأولالوصول إلى أعضاء الأبعملية الـ Upcastingمراجعة: هرمية الأشكال9مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرةتنفيذ المستطيلاستخدام تعدد الأشكالحاوية الأشكالتدرّب بنفسك: مترجم C عبر الإنترنت