Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /home/studb20/public_html/index.php on line 4
 1.16.6 Покажчики на функції - Програмування С, С++теорія та практика (частина 1) - Studbook

Програмування С, С++теорія та практика (частина 1)

1.16.6 Покажчики на функції

Як згадувалося раніше, на функцію, як і на інший об’єкт мови Сі можна створити покажчик.

£1оа£ (*£ипс) (£1оа^ а, £1оа£ Ь); /* покажчик на функцію, що приймає два параметри типу йоаі і повертає значення типу йоаі */

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

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

Розглянемо приклад, що містить грубу помилку, спробу працювати з непроініціалізованим покажчиком.

#іпс1игіе<з'Ьгііо. Ь>

#іпс1ийе<сопіо.Ь>

VОій. таіп ^оігі.)

{

Vоігі. (*е£сЬ)(сЬаг *з); /* змінній-покажчику виділена ОП, але еґсі не містить значення адреси ОП для функції */ е£с£ ("Еггог") ; /* груба помилка - спроба працювати з неініціалізованим покажчиком*/

}

Для того, щоб можна було використовувати покажчик на функцію потрібно спочатку присвоїти йому значення адреси пам’яті, де розташована функція, як це зроблено в наступному прикладі.

#іпс1игіе<з'Ьгііо. Ь>

#іпс1ийе<сопіо.Ь>

VОій. ргіп^(сЬаг *з)

{

ри'Ьз (з);

}

VОій. таіп ^оігі.)

{

VОій. (*е£сЬ) (сЬаг *з) ;

е£с£=&ргіп£;                                         /* еГсІ=ргІПІ */

(*е£с£) ("ЕипсЬіоп Ргіп^!"); /* еГсІ("РипсІіоп Ргіпі!"); */

}

Для отримання значення адреси функції необов’язково використовувати операцію &. Тому наступні присвоювання будуть мати однаковий результат :

1)   . е£с'Ь=&ргіп'Ь;

2)   . е£с'Ь=ргіп'Ь;

Операція розіменування покажчика на функцію * також є необов ’ язковою.

1)   .     (*е£с-)("Еипс-іоп Ргіп-!");

2)   . е£с-("Еипс-іоп Ргіп-!") ;

Покажчикам на функції можна присвоювати адреси стандартних бібліотечних функцій.

#іпс1ийе<з-йіо.Ь>

#іпс1ийе<сопіо.Ь>

#іпс1ийе<та-Ь.Ь>

VОій. таіп ^оій.)

{

йоиЬ1е (*£п)(йоиЬ1е х);

£1оа- у,х=1;

£п=зіп; у=£п(х) ;

ргіп'Ь£("зіп(%д)==%д\п",х,у);

£п=соз; у=£п(х) ;

ргіп-£("соз(%д)==%д\п",х,у);

}

Покажчики на функції можуть також виступати в якості аргументів функцій.

#іпс1ийе<з-йіо.Ь>

#іпс1ийе<сопіо.Ь>

#іпс1ийе<та-Ь.Ь>

йоиЬ1е £п(йоиЬ1е (*р£п) (йоиЬ1е х) ,йоиЬ1е х)

{

йоиЬ1е у=р£п(х); ргіп-£("у==%д\п",у); ге-игп у;

}

йоиЬ1е зіп_соз(йоиЬ1е х)

{

ге-игп зіп(х)*соз(х);

}

Vоій. таіп ^оій.)

{

£п(зіп,1) ;

£п(&соз,1) ;

£п(&зіп_соз,1) ;

}

 

79