0Pricing
C Academy · درس

التصريح بمؤشرات الدوال

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

التصريح بمؤشرات الدوال درس مجاني في C Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.

للدوال عناوين

مثل البيانات تمامًا، توجد كل دالة في عنوان داخل الذاكرة. يخزّن مؤشر الدالة ذلك العنوان، بحيث يمكنك استدعاء الدالة بصورة غير مباشرة.

#include <stdio.h>

void greet(void) { printf("hello\n"); }

int main(void) {
    void (*fp)(void) = greet;
    fp();
    return 0;
}

قراءة التصريح

يعني التصريح int (*fp)(int) أن fp مؤشر إلى دالة تستقبل قيمة من النوع int وتُرجع قيمة من النوع int.

الأقواس المحيطة بـ *fp مطلوبة.

#include <stdio.h>

int square(int x) { return x * x; }

int main(void) {
    int (*fp)(int) = square;
    printf("%d\n", fp(5));
    return 0;
}

إسناد دالة

يتحوّل اسم الدالة إلى عنوانها، لذا فإن fp = square وfp = &square متكافئان.

#include <stdio.h>

int dbl(int x) { return x * 2; }

int main(void) {
    int (*fp)(int);
    fp = &dbl;
    printf("%d\n", fp(7));
    return 0;
}

الاستدعاء عبر المؤشر

يمكنك الاستدعاء عبر مؤشر دالة باستخدام fp(args) أو باستخدام الصيغة الصريحة (*fp)(args). كلاهما ينفّذ الشيء نفسه.

#include <stdio.h>

int add1(int x) { return x + 1; }

int main(void) {
    int (*fp)(int) = add1;
    printf("%d\n", fp(10));
    printf("%d\n", (*fp)(10));
    return 0;
}

يجب أن يطابق التوقيع

يتضمن نوع مؤشر الدالة نوع القيمة المُرجعة وأنواع المعاملات. ولا يمكنك إسناد دالة إليه إلا إذا طابق توقيعها التوقيعَ المطلوب تمامًا.

#include <stdio.h>

double half(double x) { return x / 2.0; }

int main(void) {
    double (*fp)(double) = half;
    printf("%f\n", fp(9.0));
    return 0;
}

إعادة الإسناد أثناء التشغيل

مؤشر الدالة متغير، لذا يمكنك توجيهه إلى دوال مختلفة أثناء تشغيل البرنامج.

#include <stdio.h>

int inc(int x) { return x + 1; }
int dec(int x) { return x - 1; }

int main(void) {
    int (*op)(int) = inc;
    printf("%d\n", op(5));
    op = dec;
    printf("%d\n", op(5));
    return 0;
}

الاختيار حسب الشرط

حدّد الدالة التي تريد استدعاءها استنادًا إلى قيمة أثناء التشغيل، ثم استدعها عبر مؤشر واحد.

#include <stdio.h>

int plus(int a) { return a + 10; }
int minus(int a) { return a - 10; }

int main(void) {
    int up = 1;
    int (*op)(int) = up ? plus : minus;
    printf("%d\n", op(100));
    return 0;
}

استخدام typedef لتحسين الوضوح

صياغة مؤشرات الدوال مطوّلة. يتيح typedef منح النوع اسمًا، مما يجعل التصريحات أوضح.

#include <stdio.h>

typedef int (*IntOp)(int);

int triple(int x) { return x * 3; }

int main(void) {
    IntOp op = triple;
    printf("%d\n", op(4));
    return 0;
}

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

يمكن لمؤشرات الدوال وصف أي توقيع. إليك مؤشرًا لعملية حسابية ثنائية على أعداد صحيحة.

#include <stdio.h>

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

int main(void) {
    int (*op)(int, int) = sum;
    printf("%d\n", op(3, 4));
    return 0;
}

مؤشر دالة بقيمة NULL

مثل مؤشرات البيانات، يمكن أن تكون قيمة مؤشر الدالة NULL. تحقّق دائمًا قبل استدعاء مؤشر قد لا يكون معينًا.

#include <stdio.h>

int twice(int x) { return x * 2; }

int main(void) {
    int (*op)(int) = NULL;
    if (op == NULL) op = twice;
    if (op) printf("%d\n", op(8));
    return 0;
}

طباعة العنوان

يمكنك فحص العنوان المخزّن. فلكل دالة عنوان مختلف.

#include <stdio.h>

int f(int x) { return x; }

int main(void) {
    int (*fp)(int) = f;
    printf("function pointer is %s\n", fp ? "set" : "null");
    return 0;
}

اختبار سريع

اختبر مدى فهمك لتصريحات مؤشرات الدوال.

مراجعة

تعلّمتَ التصريح عن مؤشرات الدوال واستخدامها:

  • الصياغة: ret (*name)(params) مع ضرورة استخدام الأقواس.
  • أسند إليها اسم الدالة، إذ يتحول الاسم إلى عنوان.
  • استدعها باستخدام fp(args) أو (*fp)(args).
  • يجب أن يتطابق التوقيع؛ ويحسّن typedef سهولة القراءة.

الأسئلة الشائعة

هل درس «التصريح بمؤشرات الدوال» مجاني؟

نعم — نص درس «التصريح بمؤشرات الدوال» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.

ماذا ستتعلم في «التصريح بمؤشرات الدوال»؟

مؤشرات إلى الدوال تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟

لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «التصريح بمؤشرات الدوال»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟

نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. التصريح بمؤشرات الدوال
  2. تمرير الدوال
  3. qsort مع المقارِنات
  4. جداول مؤشرات الدوال
← العودة إلى C Academy