Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекція 20-21.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
380.74 Кб
Скачать

Вказівник на функцію

У мові С для побудови абстрактних типів даних використовується вказівник на функцію. При цьому читання опису об'єкта в С ускладнюється. У загальному випадку опис об'єкта – це ідентифікатор (позначення об'єкта), доповнений різними ознаками, модифікаторами та позначеннями типу. Для читання опису використовують певний алгоритм.

Алгоритм читання оператора опису

  • знайти позначення об'єкта (ідентифікатор);

  • перевірити, чи є праворуч від позначення дужки () або [];

  • якщо є, то читати опис зліва на право, а якщо ні, то читати опис справа на ліво;

  • перевірити, чи є ліворуч від позначення символ *;

  • якщо є, то читати опис справа на ліво;

  • якщо є дужки, як у виразі, то спочатку читати всередині дужок;

  • наприкінці читати позначення типу.

Приклади читання оператора опису

int nA; - опис змінної цілого типа;

int| *pnA; - опис вказівної змінної цілого типу;

int| *pnA[5] - опис масивів вказівників з п'яти елементів цілого типу;

int| (*pnA|)[5] - опис вказівника на масиви з п'яти елементів;

int| *pf() - опис функції без параметрів, яка повертає вказівник на значення цілого типу;

void(*pj)() - опис вказівника на процедуру без параметрів;

int (*p())[3] - опис функції, яка повертає вказівник на масив із трьох елементів цілого типу.

Вказівник на функцію. Приклад

struct StackRec{

int m_s[128];

int m_sp;

void (*m_Push) (StackRec*,int);

int (*m_Pop) (StackRec*);

void (*m_Init) (StackRec*);

};

void Push(StackRec *Stack, int nMes)

{

Stack->m_s[Stack->m_sp] = nMes;

Stack->m_sp ++;

}

int Pop(StackRec *Stack)

{

int nTemp;

nTemp = Stack->m_s[Stack->m_sp];

Stack->m_sp --;

return nTemp;

}

void Init(StackRec *Stack)

{

Stack->m_sp = 0;

}

void main()

{

StackRec *pStack;

pStack = new StackRec;

pStack->m_Push = Push;

pStack->m_Pop = Pop;

pStack->m_Init = Init;

pStack->m_Init(pStack);

pStack->m_Push(pStack, 22);

pStack->m_Push(pStack, 33);

}