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 покажчики. Покажчики на функцію


У мові програмування C функція теж має адресу і може мати покажчик. Покажчик на функцію є виразом або змінну, які використовуються для представлення адреси функції. Покажчик на функцію містить адресу першого байта в пам'яті, за яким розташовується виконується код функції.

Найпоширенішим покажчиком на функцію є її ім'я. За допомогою імені функції ми можемо викликати її і отримувати результат її роботи.

Але також покажчик на функцію ми можемо визначати у вигляді окремої змінної за допомогою наступного синтаксису:

тип (*імя_показчика) (параметри);

Тут тип являє тип повертається функцією значення.

імя_указателя представляє довільно обраний ідентифікатор відповідно до правил про найменування змінних.

І параметри визначають тип і назву параметрів через кому при їх наявності.

Наприклад, визначимо покажчик на функцію:

void (*message) (void);>

Тут визначено покажчик, який має ім'я message . Він може вказувати на функції без параметрів, які повертають тип void (тобто нічого не повертають).

Застосуємо цей покажчик на функцію:

#include <stdio.h>
 
void hello(void)
{
    printf("Hello, World \n");
}
void goodbye()
{
    printf("Good Bye, World \n");
}
int main(void)
{
    void (*message) (void);
     
    message=hello;
    message();
    message = goodbye;
    message();
    return 0;
}

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

message=hello;

Тобто в даному випадку покажчик message тепер зберігає адресу функції hello. І за допомогою звернення до покажчика ми можемо викликати цю функцію:

message();

Згодом ми можемо присвоїть вказівником адресу іншої функції, як в даному випадку. У підсумку результатом даної програми буде наступний висновок:

void (*message) (void);

НЕ буде аналогічно наступного визначення:

void *message (void);

У другому випадку визначений не покажчик на функцію, а прототип функції message, яка повертає покажчик типу void * .

Розглянемо ще один покажчик на функцію:

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

Тут визначено покажчик operation, який може вказувати на функцію з двома параметрами типу int , що повертає також значення типу int . Відповідно ми можемо привласнити покажчику адреси функцій add і subtract і викликати їх, передавши при виклику в покажчик потрібні значення для параметрів.


Масиви покажчиків на функції

Крім одиночних покажчиків на функції ми можемо визначати їх масиви. Для цього використовується наступний формальний синтаксис:

тип (*имя_массива[размер]) (параметры)

наприклад:

double (*actions[]) (int, int)

Тут actions представляє масив покажчиків на функції, кожна з яких обов'язково повинна приймати два параметри типу int і повертати значення типу double .

Подивимося застосування масиву покажчиків на функції на прикладі:

#include <stdio.h>
 
void add(int x, int y)
{
    printf("x+y=%d \n", x+y);
}
void subtract(int x, int y)
{
    printf("x+y=%d \n", x-y);
}
void multiply(int x, int y)
{
    printf("x*y=%d \n", x*y);
}
int main(void)
{
    int a = 10;
    int b = 5;
    void (*operations[3])(int, int) = {add, subtract, multiply};
     
    // получаем длину массива
    int length = sizeof(operations)/sizeof(operations[0]);
     
    for(int i=0; i<length;i++)
    {
        operations[i](a, b);    // вызов функции по указателю
    }
     
    return 0;
}

Тут масив operations містить три функції add, subtract і multiply, які послідовно викликаються в циклі через перебір масиву в функції main.


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