Читайте также: |
|
Возможны только две операции с функциями: вызов и взятие адреса. Указатель, полученный с помощью последней операции, можно впоследствии использовать для вызова функции. Например:
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, с которой начинается выполнение Си-прораммы, может быть |