Объявление указателей на функции
Указатели на функции
«Объявление указателей на функции» — бесплатный урок 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. Всегда проверяйте такой указатель перед вызовом, если он мог остаться не задан.
#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 включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Объявление указателей на функции
- Передача функций
- qsort с компараторами
- Таблицы указателей на функции