C установка IDE C структура програми C змінні C типи даних С функція printf C константи C арифметичні операції C операції порівняння і логічні операції C порозрядні операції C операції присвоювання C перетворення типів C умовні конструкції C цикли С масиви і рядки С функція scanf C препроцесор. Директива #include C #define директива C макроси C умовна компіляція C функції. Визначення та опис функцій C функції. Передача параметрів в функцію C функції. Повернення результату з функції C функції. Рекурсивні функції C область видимості змінних C зовнішні об'єкти C вказівники C вказівник. Операції з вказівниками C покажчики. Арифметика покажчиків C покажчики. Константи і покажчики C покажчики. Покажчики та масиви C покажчики. Масиви покажчиків, рядки і багаторівнева адресація C покажчики. Покажчики в параметрах функції C покажчики. Динамічна пам'ять C покажчики. Покажчик як результат функції C покажчики. Управління динамічної пам'яттю C покажчики. Покажчики на функцію C покажчики. Покажчики на функції як параметри і результати функцій C покажчики. Функції зі змінною кількістю параметрів C struct. Визначення структур C struct. Структури як елементи структур C struct. Покажчики на структури C struct. Масиви структур C struct. Структури і функції C struct. union об'єднання C struct. Бітові поля С file. Введення-виведення і робота з файлами C file. Читання і запис бінарних файлів C file. Читання і запис структур в файл C file. Читання і запис текстових файлів C file. Форматування вводу-виводу C file. Позиціонування в потоці C file. Консольне введення-виведення

C покажчики. Покажчики на функції як параметри і результати функцій


Покажчики на функції як параметри

Покажчик на функцію може передаватися в іншу функцію як параметр. наприклад:

#include <stdio.h>
 
int add(int x, int y)
{
    return x+y;
}
int subtract(int x, int y)
{
    return x-y;
}
int operation(int (*op)(int, int), int a, int b)
{
    return op(a, b);
}
int main(void)
{
    int a = 10;
    int b = 5;
    int result;
    result = operation(add, a, b);
    printf("result=%d \n", result);
    result = operation(subtract, a, b);
    printf("result=%d \n", result);
    return 0;
}

Тут у функції operation перший параметр - покажчик int (*op)(int, int) являє функцію, яка повертає значення типу int і приймає два параметри типу int . Результатом функції є виклик тієї функції, на яку вказує покажчик.

Визначенню покажчика відповідають дві функції: add і subtract, тому їх адресу можна передати в виклик функції operation: operation(add, a, b); .

Інший приклад - функція, яка може приймати як параметр деякий умова:

#include <stdio.h>
 
int isEven(int x)
{
    return x%2==0;
}
int isPositive(int x)
{
    return x>0;
}
void action(int (*condition)(int), int numbers[], int n)
{
    for(int i=0; i<n; i++)
    {
        if(condition(numbers[i])!=0)
        {
            printf("%d \t", numbers[i]);
        }
    }
}
int main(void)
{
int nums[] = {-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5};
    int n = sizeof(nums)/sizeof(nums[0]);
     
    printf("\n Even numbers: ");
    action(isEven, nums, n);
    printf("\n Positive numbers: ");
    action(isPositive, nums, n);
    return 0;
}

Перший параметр функції action - покажчик int (*condition)(int) являє функцію, яка приймає ціле число і в залежності від того, відповідає воно умові чи ні, повертає 1 (якщо відповідає) або 0. На момент визначення функції action точне умова може бути невідомо.

У поточній програмі умови представлені двома функціями. Функція isEven() повертає 1, якщо число парне, і 0, якщо число непарне. А функція isPositive() повертає 1, якщо число позитивне, і 0, якщо негативне.

При виконанні функції action() в неї можна передати необхідна умова: action(isEven, nums, n); . В результаті програма виведе на екран числа з масиву nums, які відповідають переданим умові:

#include <stdio.h>
 
int action1(void)
{
    printf("Action 1");
    return 1;
}
int action2(void)
{
    printf("Action 2");
    return 2;
}
int action3(void)
{
    printf("Action 3");
    return 3;
}
int (*select(void))(void)
{
    int choice; // выбранный пункт
     
    // массив указателей на функции, которые будут возвращаться
    int (*actions[])() = {action1, action2, action3};
     
    // выбираем действие по номеру
    printf("Select action (1, 2, 3): ");
    scanf("%d", &choice);
    // возвращаем нужную функцию
    if(choice >0 && choice<4)
        return actions[choice-1];
    else
        return NULL;
}
int main(void)
{
    int (*action)(void);    // указатель на выбранную функцию
    int actionNumber;       // результат функции - номер действия
    while(1)
    {
        action = select();  // получаем указатель на функцию
        if(action==NULL)
            break;
        actionNumber = action(); // выполняем функцию
        printf("\nselected action %d \n", actionNumber);
    }
    printf("End");
    return 0;
}

У даній програмі ми припускаємо, що користувач повинен вибрати для виконання одну з трьох функцій: action1, action2, action3.

Сам вибір відбувається в функції select() . Вона повертає покажчик на функцію - по суті обрану функцію.

Всі обрані функції мають прототип виду:

int action1(void);

І прототип функції select повинна відповідати цьому прототипу:

int (*select(void))(void)

Для зберігання всіх дій у функції select визначений масив покажчиків на функції actions:

int (*actions[])() = {action1, action2, action3};

За допомогою введеного з клавіатури числа визначаємо номер потрібного дії, яке треба виконати. Якщо номер менше 1 або більше 3, то повертається константа NULL.

У головній функції main() в нескінченному циклі викликаємо функцію select, отримуючи в якості результату покажчик на функцію:

action = select();

І якщо курсор не дорівнює NULL, то після цього ми зможемо викликати функцію за вказівником і отримати її результат:

actionNumber = action();

Консольний висновок роботи програми:

Виберіть дію (1, 2, 3): 1
дія 1
обрану дію 1
Виберіть дію (1, 2, 3): 3
дія 3
обрану дію 3
Виберіть дію (1, 2, 3): 4
кінець

Наш партнер:
beta test mp3 playlist downloader