C++.Бархатный путь




Тип функции - часть 2


Описанию этого типа соответствует, например, функция void *malloc (int size);

Эта функция пытается выделить блок памяти размера size и в случае, если это удалось сделать, возвращает указатель на выделенную область памяти. В противном случае возвращается специальное значение NULL. Как распорядиться выделенной памятью - личное дело программиста. Единственное ограничение заключается в том, что при этом необходимо использовать явное преобразование типа: #include <stdlib.h> char *p = NULL; void NewMemory () { p = malloc(sizeof(char)*1024);// Этот оператор не пройдёт! p = (char*) malloc(sizeof(char)*1024); // Требуется явное преобразование типа. }

Имя массива, если к нему не применяется операция индексации, оказывается указателем на первый элемент массива. Аналогично, имя функции, если к нему не применяется операция вызова, является указателем на функцию. В нашем случае ранее объявленная функция под именем MyFp приводится к безымянному указателю типа char * (*) (int, int, int*, float)

К имени функции может быть применена операция взятия адреса. Её применение также порождает указатель на эту функцию. Таким образом, MyFp и &MyFp имеют один и тот же тип. А вот как инициируется указатель на функцию: char* (*MyPt2) (int, int, int*, float) = MyFp;

Очевидно, что функция MyFp() должна быть к этому моменту не только объявлена, но и определена.

Новому указателю на функцию char* (*MyPt3) (int, int, int*, float);

можно также присвоить новое значение.

Для этого достаточно использовать ранее определённый и проинициализированный указатель: MyPt3 = MyPt2;

Или адрес ранее определённой функции: MyPt3 = MyFp;

При этом инициализация и присваивание оказываются корректными лишь при условии, что имеет место точное сопоставление списков формальных параметров и списков формальных значений в объявлениях указателей и функций.

Для вызова функции с помощью указателя использование операции разыменования не обязательно. Полная форма вызова char* MyPointChar = (*MyPT3)(7,7,NULL,7.7);

имеет краткую эквивалентную форму char* MyPointChar = MyPT3(7,7,NULL,7.7);




Содержание  Назад  Вперед