Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Указатель на функцию

Читайте также:
  1. АЛФАВИТНЫЙ УКАЗАТЕЛЬ ВОЛШЕБНЫХ ТВАРЕЙ ОТ А ДО Я
  2. Внезародышевый орган аллантоис выполняет функцию...
  3. Внезародышевый орган плацента выполняет функцию...
  4. Географический указатель
  5. ГЕОГРАФИЧЕСКИЙ УКАЗАТЕЛЬ
  6. ГЕОГРАФИЧЕСКИЙ УКАЗАТЕЛЬ
  7. Для перемещения окна на экране указатель мыши надо установить

Возможны только две операции с функциями: вызов и взятие адреса. Указатель, полученный с помощью последней операции, можно впоследствии использовать для вызова функции. Например:

void error(char* p) { /* ... */ }

void (*efct)(char*); - указатель на функцию, которая ничего не возвращает и

Получает указатель на строку

Void f()

{

efct = &error; // efct настроен на функцию error

efct = error; // можно написать и так, компилятор поймет

(*efct)("Not free memory!"); // вызов error через указатель efct

}

Для вызова функции с помощью указателя (efct в нашем примере) надо вначале применить операцию разадресации к указателю - *efct. Поскольку приоритет операции вызова () выше, чем приоритет косвенной адресации “ * ”, нельзя написать *efct("error"). Это будет означать *(efct("error")), что является ошибкой. По той же причине скобки нужны и при описании указателя на функцию. Однако, писать просто efct("Not free memory!") можно, так как транслятор понимает, что efct является указателем на функцию, и создает команды, делающие вызов нужной функции.

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

Нарпример у нас есть две функции сравнения целых чисел.

int More(int a1, int a2) { return a1>a2; }

и

int Less(int a1, int a2) { return a1>a2; }

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

void Sort(int Arr, int Dim, int(*Compare)(int, int))

{

Int Change, tmp;

While(1)

{

Change=0;

for(int i=0;i<Dim-1;i++)

{

if((*Compare)(Arr[i],Arr[i+1])

// if(Compare(Arr[i],Arr[i+1]) а можно и так, компилятор поймет

{

tmp=Arr[i]; Arr[i]=Arr[i+1]; Arr[i]=tmp;

Change=1;

}

}

if(!Change)

Return;

}

}

Мoid main(void)

{

int a[5]={1,2,3,4,5},i;

Sort(a,5,&Less);

// Sort(a,5,Less); а можно и так, компилятор поймет

for(i=0;i<5;i++)

cout<<a[i]<<" ";

cout<<'\n'; //5 4 3 2 1

Sort(a,5,More);

for(i=0;i<5;i++)

cout<<a[i]<<" "; //1 2 3 4 5

Getch();

}

Отметим, что формальные параметры в указателях на функцию описываются

Так же, как и в обычных функциях. При присваивании указателю на функцию

Требуется точное соответствие типа функции и типа присваиваемого значения.

Например:

void (*pf)(char*); // указатель на void(char*)

void f1(char*); // void(char*);

int f2(char*); // int(char*);

void f3(int*); // void(int*);

pf = &f1; // нормально

pf = &f2; // ошибка: не тот тип возвращаемого значения

pf = &f3; // ошибка: не тот тип параметра

(*pf)("asdf"); // нормально

(*pf)(1); // ошибка: не тот тип параметра

int i = (*pf)("qwer"); // ошибка: void присваивается int

Правила передачи параметров одинаковы и для обычного вызова, и для

Вызова с помощью указателя.

Передача параметров в функцию main из командной строки


Дата добавления: 2015-07-07; просмотров: 102 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Параметры функции по умолчанию| Функция main, с которой начинается выполнение Си-прораммы, может быть

mybiblioteka.su - 2015-2021 год. (0.017 сек.)