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

План

Пример

#include <stdio.h>

struct bal{

char name[80];

float cash;

};

int main(void)

{

register int i;

FILE *fp;

bal balance[100];

// открытие на запись

if((fp=fopen("balance","wb"))==NULL) {

printf("Cannot open file.\n");

return 1;

}

for(i=0;i<100;i++) {

balance[i].name[0]='a'+(i%26);

balance[i].name[1]='a'+(i/26);

balance[i].name[2]='\0';

balance[i].cash=(float)i;

}

// сохранение массива balance

fwrite(balance,sizeof balance,1,fp);

fclose(fp);

//обнуление массива

for(i=0;i<100;i++) {balance[i].cash=0.0;}

if((fp=fopen("balance","rb"))==NULL) {

printf("Cannot open file.\n");

return 1;

}

//чтение массива

fread(balance, sizeof balance,1,fp);

//вывод содержимого массива

for(i=0; i<100; i++) {

printf("%s = ", balance[i].name);

printf("%9f\n",balance[i].cash);

}

printf("\n");

fclose(fp);

return 0;

}

1.Указатели на функции

2.Структуры

3.Доступ к членам структуры

4.Присваивание структур

5.Массивы структур


Хотя функция – это не переменная, она имеет физическое положение в памяти, которое может быть присвоено указателю. Адрес, присвоенный указателю, является входной точкой в функцию. Указатель может использоваться вместо имени функции. Он также позволяет передавать функции как обычные аргументы в другие функции.

Адрес функции получается при использовании имени функции без скобок и аргументов. Пример:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <math.h>

#define PI 3.1415

double del2(double a, double b, double eps, double (*f)(double));

int main(void)

{

double (*p)(double);

p = sin;

double a = -PI/2, b = PI/2, eps = 0.0001;

printf("Root = %lf\n", del2(a,b,eps,p));

printf("Root = %lf\n", del2(a,b,eps,sin));

return 0;

}

double del2(double a, double b, double eps, double (*f)(double))

{

if(b<a) {

puts("Left bigger than right");

exit(0);

}

if(eps <= 0) {

puts("Eps <= 0");

exit(0);

}

if(f(a) == 0) return a;

if(f(b) == 0) return b;

while(b-a >= eps) {

double x=(a+b)/2;

if(f(a)*f(x) < 0.) a=x;

else if(f(x) == 0.) return x;

else b=x;

}

return (a+b)/2;

}

Когда вызывается del2(), ей передаются числа с плавающей точкой двойной точности и один указатель на функцию. Скобки вокруг *f необходимы для правильной интерпретации компилятором данного выражения.

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

Рассмотрим работу функции sin() в функции del2(). Оператор

if(f(a) == 0) return a;


осуществляет вызов функции, в данном случае sin(), с помощью f, который указывает на данную функцию. Вызов происходит с аргументом a.

Бывают моменты, когда выгодно передавать функции в процедуры или хранить массивы функций. Пример:

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#include <string.h>

void enter(void), del(void); void review(void), quit(void);

int menu(void);

void (*options[])(void) = {

enter,

del,

review,

quit

};

int main(void)

{

int i;

i = menu();

(*options[i])();

getchar();

return 0;

}

int menu(void)

{

char ch;

do {

printf("1. Enter\n");

printf("2. Delete\n");

printf("3. Review\n");

printf("4. Quit\n");

printf("Select a number:");

ch = getche();

printf("\n");

}while(!strchr("1234", ch));

return ch-49;

}

void enter(void)

{ printf("In enter.");}

void del(void)

{ printf("In del.");}

void review(void)

{ printf("In review.");}

void quit(void)

{

printf("In quit.");

exit(0);

}



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: