Программирование · 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  

Заключение

Указатели на функции могут быть полезны, когда вы хотите создать то, что называется ‘механизм обратного вызова’ (узнайте больше об этом здесь). Но прежде чем углубляться в это, лучше, если вы получите хорошее понимание этой концепции. Мы рекомендуем вам попробовать примеры из этого учебника на вашем локальном компьютере (а также создать новые). В случае любых сомнений или вопросов оставьте комментарий ниже.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.