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. Всегда проверяйте такой указатель перед вызовом, если он мог остаться не задан.

#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 — локальная установка не требуется.

Все уроки этого курса

  1. Объявление указателей на функции
  2. Передача функций
  3. qsort с компараторами
  4. Таблицы указателей на функции
← Назад к C Academy