Menu
Coddy logo textTech

Объявление указателей на функции

Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 33 из 61.

До сих пор мы учились имитировать наследование с помощью встраивания структур. Но настоящий полиморфизм, при котором разные объекты по-разному реагируют на один и тот же вызов, требует кое-чего ещё: указателей function.

Указатель function — это переменная, которая хранит адрес function. Как и обычный pointer, хранящий адрес данных, pointer function хранит адрес исполняемого кода.

Сначала синтаксис может показаться пугающим. Чтобы объявить указатель на функцию, укажите тип возвращаемого значения, затем имя указателя в скобках со звёздочкой, а после этого — типы параметров:

int (*operation)(int, int);

Это объявляет переменную с именем operation, которая может указывать на любую function, taking два int parameters и возвращающую int. Скобки вокруг *operation имеют критическое значение: без них вы объявляли бы function, которая возвращает указатель.

Чтобы assign function этому pointer, просто используйте имя function (без скобок):

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

int (*operation)(int, int);
operation = add;  // Теперь operation указывает на add

Имя function действует как её адрес. Также можно явно использовать &add, но это необязательно: обе формы эквивалентны в C.

challenge icon

Задание

Легко

Давайте потренируемся объявлять указатели на function и присваивать им functions. Вы создадите простую систему математических операций, в которой указатель на function может хранить разные арифметические functions.

Напишите программу, которая:

  1. Определяет две functions:
    • multiply: принимает два параметра int и возвращает их произведение
    • subtract: принимает два параметра int и возвращает разность первого и второго
  2. В main объявляет переменную-указатель на function с именем operation, которая может указывать на functions, принимающие два параметра int и возвращающие int
  3. Считывает три входных значения: два целых числа и код operation (1 для multiply, 2 для subtract)
  4. На основе кода operation присваивает подходящую function вашему указателю operation
  5. Выводит имя присвоенной operation, а затем выводит результат вызова function через указатель

Вы получите три входных значения: первое число, второе число и код operation (1 или 2).

Ваш вывод должен выглядеть так:

Operation: multiply
Result: 35

Здесь multiply — имя operation (или subtract, если код равен 2), а 35 — результат вызова function через ваш указатель (в данном случае 5 × 7).

Помните: чтобы объявить указатель на function, вам нужны тип возвращаемого значения, имя указателя в скобках со звёздочкой и типы параметров. Чтобы присвоить function, используйте только имя function без скобок.

Попробуйте сами

#include <stdio.h>

// TODO: Определите функцию multiply здесь


// TODO: Определите функцию subtract здесь


int main() {
    int num1, num2, code;
    
    // Считать ввод
    scanf("%d", &num1);
    scanf("%d", &num2);
    scanf("%d", &code);
    
    // TODO: Объявите указатель на функцию с именем 'operation', который может указывать на
    // функции, принимающие два параметра типа int и возвращающие int
    
    
    // TODO: На основе кода операции (1 для multiply, 2 для subtract),
    // присвойте соответствующую функцию вашему указателю operation
    
    
    // TODO: Выведите название операции и результат
    // Формат:
    // Operation: <name>
    // Result: <result>
    
    return 0;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C