Объявление указателей на функции
Часть раздела Объектно-ориентированное программирование путешествия по 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.
Задание
ЛегкоДавайте потренируемся объявлять указатели на function и присваивать им functions. Вы создадите простую систему математических операций, в которой указатель на function может хранить разные арифметические functions.
Напишите программу, которая:
- Определяет две functions:
multiply: принимает два параметраintи возвращает их произведениеsubtract: принимает два параметраintи возвращает разность первого и второго
- В
mainобъявляет переменную-указатель на function с именемoperation, которая может указывать на functions, принимающие два параметраintи возвращающиеint - Считывает три входных значения: два целых числа и код operation (1 для multiply, 2 для subtract)
- На основе кода operation присваивает подходящую function вашему указателю
operation - Выводит имя присвоенной 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;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик7Указатели на функции
Объявление указателей на функцииВызов указателей на функцииTypedef для указателей на функцииПередача функций в качестве аргументовИтоги: Диспетчеризация калькулятора2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигурПотренируйтесь самостоятельно: Онлайн-компилятор C