Программирование · 2 min read · Nov 22, 2025
Учебник по программированию на C для Linux Часть 25 - Указатели на функции

До сих пор в этой продолжающейся серии учебников по программированию на C мы обсуждали основную концепцию указателей, а также множество аспектов, связанных с указателями, таких как указатель на массив и массив указателей. Расширяя наше понимание указателей, в этом учебнике мы обсудим концепцию указателей на функции.
Указатели на функции в языке программирования C
Так же, как у нас есть указатели на переменные, могут быть и указатели на функции. Следующий пример демонстрирует объявление указателя на функцию:
void (*fn_ptr)(int)Итак, здесь у нас есть указатель на функцию с именем ‘fn_ptr’, который может указывать на любую функцию, которая возвращает void и принимает целое число в качестве входного параметра. Не нужно говорить, что это только часть объявления - как и любой другой указатель, вам нужно присвоить ему адрес (в данном случае адрес функции), чтобы использовать его.
Следующий пример использует этот указатель:
#include
void print_int(int a)
{
printf("\n Целочисленное значение: %d\n",a);
}
int main()
{
void (*fn_ptr)(int);
fn_ptr = &print_int;
(*fn_ptr)(10);
return 0;
} Как вы можете видеть, мы сначала определили функцию ‘print_int’, которая принимает целое число и возвращает void. Затем, в функции ‘main’, мы объявили ‘fn_ptr’ как указатель на функцию, который может указывать на функции, такие как ‘print_int’. После этого мы присвоили адрес функции ‘print_int’ указателю ‘fn_ptr’, и, наконец, вызвали функцию с помощью указателя.
Вот вывод:
Целочисленное значение: 10 Стоит упомянуть, что вы можете еще больше упростить эту программу, избегая & и * в последних двух строках. Вот измененный код:
#include
void print_int(int a)
{
printf("\n Целочисленное значение: %d\n",a);
}
int main()
{
void (*fn_ptr)(int);
fn_ptr = print_int;
fn_ptr(10);
return 0;
} Двигаясь дальше, как и массив указателей, вы также можете иметь массив указателей на функции. Например, следующий массив указателей на функции может хранить 3 адреса функций.
void (*fn_ptr[3])(int)А вот пример, использующий этот массив указателей:
void print_int1(int a)
{
printf("\n Целочисленное значение: %d\n",a);
}
void print_int2(int a)
{
printf("\n Целочисленное значение: %d\n",a+1);
}
void print_int3(int a)
{
printf("\n Целочисленное значение: %d\n",a+2);
}
int main()
{
void (*fn_ptr[3])(int);
fn_ptr[0] = print_int1;
fn_ptr[1] = print_int2;
fn_ptr[2] = print_int3;
fn_ptr[0](10);
fn_ptr[1](10);
fn_ptr[2](10);
return 0;
}Вот вывод, произведенный этим кодом:
Целочисленное значение: 10
Целочисленное значение: 11
Целочисленное значение: 12Еще один аспект указателей на функции, о котором вам следует знать, это то, что вы можете использовать их в качестве аргументов функции. Например, может быть функция, которая принимает указатель на функцию в качестве аргумента. Например:
void some_random_func(void (*fn_ptr)(int)) Следующий пример кода использует эту функцию:
#include
void another_random_func(int a)
{
printf("\n Введенное целое число: %d\n", a);
}
void some_random_func(void (*fn_ptr)(int))
{
fn_ptr(5);
}
int main()
{
some_random_func(another_random_func);
return 0;
} Итак, что мы сделали здесь, так это создали функцию под названием ‘some_random_func’, которая принимает указатель на функцию в качестве входного параметра. Затем, из ‘main’, мы вызвали ‘some_random_func’ с адресом другой функции ‘another_random_func’ в качестве аргумента. Затем, используя указатель, мы успешно вызвали ‘another_random_func’.
Вот вывод:
Введенное целое число: 5 Заключение
Указатели на функции могут быть полезны, когда вы хотите создать то, что называется ‘механизм обратного вызова’ (узнайте больше об этом здесь). Но прежде чем углубляться в это, лучше, если вы получите хорошее понимание этой концепции. Мы рекомендуем вам попробовать примеры из этого учебника на вашем локальном компьютере (а также создать новые). В случае любых сомнений или вопросов оставьте комментарий ниже.
Get new posts in your inbox
No spam. Unsubscribe anytime.