Лекция 10. Общие понятия. Типы указателей. Управляемые и неуправляемые указатели. Указатели на функцию. Примеры использования


(*имя_ указателя_функции) (список параметров)



жүктеу 112.88 Kb.
бет11/12
Дата10.11.2022
өлшемі112.88 Kb.
#23641
түріЛекция
1   ...   4   5   6   7   8   9   10   11   12
Лекция 10
11 лекция
<тип возвращаемого функцией значения> (*имя_ указателя_функции) (список параметров)

Здесь тип представляет тип возвращаемого функцией значения.


имя_указателя_функции представляет произвольно выбранный идентификатор в соответствии с правилами о наименовании переменных.
Параметры определяют тип и название параметров через запятую при их наличии.
В определении указателя присутствует прототип - указатель ссылается не на произвольную функцию, а только на одну из функций с заданной схемой формальных параметров и результата.
Перед началом работы с указателем его необходимо назначить на соответствующий объект, в данном случае - на функцию. В синтаксисе Си выражение вида &имя_функции имеет смысл - начальный адрес функции или указатель на функцию.
Кроме того, по аналогии с именем массива использование имени функции без скобок также интерпретируется как указатель на эту функцию. Указатель может быть инициализирован и при определении.
Пример .
double (*p) (double);
здесь p  указатель на функцию, принимающую переменную типа double и возвращающую в качестве результата тип double.
Пример.
void (*q)(int);
В этом примере q  указатель на функцию, которая принимает переменную типа int и не возвращает результата.
Замечание 1. Нетрудно видеть, что тип результата этой функции и список параметров могут быть любыми.
Замечание 2. Указатели p и q заключены в скобки, поскольку сначала должна выполняться операция разыменования, и только потом вызов функции.
Для работы с этим указателем ему нужно присвоить какое-нибудь значение. Если у нас есть функция с тем же типом результата и набором типов параметров, что и указатель, мы можем присвоить ему указатель на эту функцию:

double f (double); // f  функция


p = &f; // p  указатель на функцию p = f;
// или проще (знак & в этом выражении можно опустить)
После того, как указателю на функцию присвоено значение, можно вызвать ту функцию, на которую он указывает, написав p(3.14).
Пример

int INC(int а) { return a+1; }


extern int DEC(int);
int (*pf)(int);
pf = &INC;
pf = INC; // присваивание указателя
int (*pp)(int) = &DEC; // инициализация указателя


Пример
Определим указатель на функцию с.о.:


void (*message) ();

В данном случае определен указатель, который имеет имя message. Он может указывать на функции без параметров, которые возвращают тип void (то есть ничего не возвращают).
Используем указатель на функцию:






#include
using namespace ctd;
void hello(); \\объявление функции hello
void goodbye();\\объявление функции goodbye
int main()
{
void (*message)();\\объявление указателя функции
message=hello; \\инициализация указателя
message(); \\вызов функции
message = goodbye;
message();
return 0;
}
void hello() \\задание функции пользователя
{
cout << "Hello, World" << endl;
}
void goodbye()
{
cout << "Good Bye, World" << endl;
}

Указателю на функцию можно присвоить функцию, которая соответствует указателю по возвращаемому типу и спецификации параметров:




message=hello;

То есть в данном случае указатель message теперь хранит адрес функции hello. И посредством обращения к указателю мы можем вызвать эту функцию:


message();

В качестве альтернативы мы можем обращаться к указателю на функцию следующим образом:


(*message)();

Впоследствии мы можем присвоит указателю адрес другой функции, как в данном случае. В итоге результатом данной программы будет следующий вывод:
Hello, World
Good Bye, World
При определении указателя стоит обратить внимание на скобки вокруг имени. Так, использованное выше определение


void (*message) ();

НЕ будет аналогично следующему определению:


void *message ();

Во втором случае определен не указатель на функцию, а прототип функции message, которая возвращает указатель типа void*.
Пример:
int (*comp)(char s1,char s2);
Это указатель на функцию comp(s1,s2), которая возвращает результат типа int. Если мы подействуем операцией разыменования (*) на этот указатель (по определению указателя записав воздействие в виде (*comp)(s1,s2)), то функция comp(s1,s2) выполнится и возвратит некое целое число.



жүктеу 112.88 Kb.

Поделитесь с Вашими друзьями:
1   ...   4   5   6   7   8   9   10   11   12




©emirb.org 2022
әкімшілігінің қараңыз

    Басты бет