Лекция 06
.pdfpublic:
int z;
};
void main ()
{
A s , *point; // создаем объект s типа A
point = &s; // инициализируем указатель адресом объекта s; point ->z = 100; // записываем в z число 100
}
Часто требуется выделять память для создания объектов классов динамически. И в этом случае требуется использовать указатель.
/* программа # 1.12 */
class A
{
public:
int z;
};
void main ()
{
A * point = new A; // создаем объект типа A и инициализируем указатель адресом это объекта.
point ->z = 100; // записываем в z число 100
…………………… // Другие операторы
…………………….
delete point; // незабываем возвращать память ОС
}
Каждому оператору new должен соответствовать свой оператор delete.
6.5. Указатели на функции
Указатель на функцию является адресом точки входа в функцию. Имя функции также является символическим адресом ее точки входа. Другими словами, символическим именем, или указателем. Покажем это на следующем примере.
/* программа # 1.13 */
# include < stdio.h> void bell(void); void main()
{
void (*f)( void );
f = bell; f();
(*f)(); // можно и так
}
/* эта функция издает гудок */
void bell (void)
{
putchar(7);
}
Объявление void (*f)( void );означает, что f является указателем на функцию, возвращающую тип void c пустым списком формальных параметров. К примеру объявление int (*func)( int, float );означает что func ecть указатель на функцию возвращающую тип int c двумя формальными параметрами типа int и float. В объявлении указателя на функцию очень важным является синтаксис. Обратите на это внимание.
Если в программе объявлен указатель, то он должен быть инициализирован. Это сделано в операторе f = bell. В данном случае указателю f присвоен адрес функции bell. Идентификатор bell - есть символический адрес памяти, с которого будет выполняться функция. Далее в программе последовательно дважды выполняется обращение к функции bell через указатель. При этом компьютер дважды издаст звуковой сигнал.
В программах указатели на функции, в основном, используются
для сохранения адресов программ обработчиков прерываний;
для передачи функций в качестве формальных параметров другим функциям.
Следующая программа # 1.14 демонстрирует такую возможность при вычислении интеграла методом площадей.
/* программа # 1.14 */
/* прототипы функций */ float integral (float (*)(float ),float ,float ,float ); float func ( float );
# include < stdio.h> void main ( void )
{
float integ; /*
- нижний предел интегрирования = 0.0;
-верхний предел интегрирования = 12.0;
-шаг по оси x = 0.2;
*/
integ = integral (func, (float)0.0,(float )12.0,(float) 0.02); printf ("Интеграл = %f\n",integ);
}
/* вычисление интеграла методом площадей */
float integral (float (*f)(float ),float l_limit, float u_limit, float delta_x)
{
/*
*/
}
return summa;
}
/* интегрирумая функция у = х */ float func ( float x )
{
return x;
}
При выполнении этой программы был получен такой результат: Интеграл = 72.000137,в то время как точное значение равно 72.0.
