Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DSD_Spiskovye_struktury_dannykh_na_baze_massivo...doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
3 Мб
Скачать
☆

4.3Условия использования указателей на функции

Для функций, которые передаются как параметры других функций должен быть заранее объявлен прототип.

int APlusB (int , int ); // Прототип функции APlusB

int AсtionWithNumbers (int a, int b, TPFunc Func_Arifm )

{

int rez ;

rez = Func_Arifm (a, b); /*вызов функции, переданной в качестве параметра*/

return rez;

} /* AсtionWithNumbers */

Функция APlusB имеет следующий вид:

int APlusB (int a, int b)

{

return a+b;

}

Вызов функции APlusB, которая является аргументом функции AсtionWithNumbers:

void Form1::button2_Click(System::Object * sender, System::EventArgs * e)

{

int f, b;

f = Convert::ToInt32(numericUpDown1->Value);

b = Convert::ToInt32(numericUpDown2->Value);

int n = AсtionWithNumbers (f, b, APlusB);

numericUpDown3->Value=n;

}

4.4Использование указателей на функцию для вызова функций

4.4.1Формат переменных-указателей на функцию и бестиповых указателей

Наличие в языке С++ аппарата переменных типа указатель функцию предоставляет возможности по гибкому изменению состава вызываемых функций в процессе выполнения программы. Действительно, связывая такую переменную с конкретной функцией, мы получаем возможность в одной и той же точке программы, в зависимости от конкретных условий, обращаться к разным функциям.

Для эффективного использования переменных-указателей на функцию и бестиповых указателей на функции необходимо четко уяснить ряд следующих положений.

Переменные-указатели на функцию по формату (адрес) совместимы с переменными типа void* (бестиповыми указателями) и после приведения типов (от бестипового указателя к переменной-указателю на функцию или от переменной-указателя на функцию к бестиповому указателю) они могут обмениваться значениями.

Потребность в приведении типов (ведь это уже адреса) вызвана тем, что компилятор воспринимает бестиповый указатель как обычный адрес, безотносительно того, что по нему находится, а переменную-указатель на функцию - как адрес (точку входа в подпрограмму), по которому должно быть передано управление – своеобразный типизированный указатель. Поэтому, для правильной генерации машинного кода необходимо явно указать, что имеется в виду просто адрес или адрес функции.

Для того чтобы переменная-указатель на функцию, например, APlusB или add_func, при приведении типов воспринималась как переменная типа void*, содержащая обычный адрес (адрес подпрограммы), эта переменная-указатель на функцию должна предваряться оператором & или ее значение присваивается переменной типа void*.

Для того чтобы при приведении типов переменная типа void* (указатель) воспринимался как переменная-указатель на функцию, она должна выступать аргументом соответствующего преобразователя типа, например (TPFunc)().

Для проверки, указывают ли две переменные-указатели на функцию P_Func1 и P_Func2 на одну и ту же функцию, выполняется сравнение вида P_Func1 == P_Func2, т.е. сравниваются адреса месторасположения этих функций.

4.4.2Преобразование переменной-указателя на функцию к бестиповому указателю на функцию

Если по переменной-указателю на функцию, например, APlusB или P_Func, требуется сформировать переменную типа void* (указатель), необходимо просто значение этой переменной-указателя присвоить переменной типа void* или же предшествовать эту переменную-указатель на функцию оператором &, например:

void* Ptr;

тогда

Ptr = APlusB;

или

Ptr = &APlusB;

Если по переменной типа void* (указатель) необходимо получить доступ к функции, эта переменная должна быть преобразована к переменной типа указатель на функцию, т.е. она должна выступать аргументом соответствующего преобразователя типа, например TPFunc(), например:

(TPFunc)Ptr