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

مراجعة مؤشرات 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 قابلة لإعادة الاستخدام حقًا.

challenge icon

التحدي

سهل

اكتب function تُسمى print_value وتقبل معاملين: مؤشر void* إلى data وراية type من نوع int. ينبغي أن تفسّر function البيانات وتطبعها استنادًا إلى راية type:

  • إذا كانت راية type هي 0، فحوّل pointer إلى int* واطبع قيمة العدد الصحيح
  • إذا كانت راية type هي 1، فحوّل pointer إلى float* واطبع قيمة العدد العشري مع منزلتين عشريتين

سيستقبل برنامجك مدخلين:

  1. راية type (0 للعدد الصحيح، 1 للعدد العشري)
  2. قيمة عددية

استنادًا إلى راية 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;
}
quiz iconاختبر نفسك

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

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

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