Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции за I семестр.docx
Скачиваний:
5
Добавлен:
17.04.2019
Размер:
267.81 Кб
Скачать

Void f1(int, const double *);

Рекомендуется указывать const перед всеми параметрами - указателями, для которых в функции не предусмотрено изменение значений, на которые они ссылаются. Это облегчает, например, отладку программы, т.к. по заголовку функции видно, какие данные в функции изменяются, а какие нет.

17.8 . Указатели на структуры

Указатели могут указывать и на структурный тип данных:

struct Point{

int x,y;

} r, *p;

p=&r;

Для обращения к полю структуры через указатель придется писать не только звездочку, но и скобки (т.к. операция "точка" имеет приоритет выше, чем "звездочка" ):

(*p).x=3; // r.x=3

(*p).y=4; // r.y=4

Ввиду распространенности подобного действия, в языке С введена специальная сокращенная запись операции доступа к полям структур и объединений при помощи указателей:

-> (стрелка);

Она означает разадресацию указателя на структуру, стоящего слева от знака ->, и переход к полю этой структуры, указанному справа от ->. Поэтому вышеприведенный пример присваивания значений полям структур можно записать и короче:

p->x=3;

p->y=4;

В сущности, подобная операция уже давно знакома читателю: все стандартные компоненты C++ Builder'а являются как раз указателями на структуры (точнее, на объекты - структуры, объявленные вместе с обрабатывающими их функциями). Поэтому, например, выражение Edit1->Text означает переход от указателя Edit1 (имеющего тип TEdit * ) к самому объекту (имеющему тип TEdit) и его полю Text .

Сказанное иллюстрируется следующим примером:

Edit1->Text="A";

Edit2->Text="B";

Edit1=Edit2; // Edit1 теперь указывает на 2-ой Edit !

Edit1->Text="C";

В результате первый Edit сохранит значение "A", а второй получит значение "C". Отметим, что после выполнения этого фрагмента программы и Edit1 и Edit2 указывают на второй Edit, и любые операции и с Edit1 , и с Edit2 будут относиться к нему; к первому же Edit'у вообще не осталось доступа из программы вплоть до завершения ее работы.

Присваивание указателей на компоненты С++ Builder'а может быть полезно, например, если компонент C++ Builder'а сделать аргументом при вызове функции.

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

В языке Си допускаются указатели не только на данные, но и на функции. Они позволяют, например, создать функцию, строящую таблицу значений любой другой функции (с заданным видом списка параметров); при этом конкретный вызов этой другой функции осуществляется через указатель на функцию.

Рассмотрим методику работы с указателями на функции.

1. Как и любой объект языка Си, указатель на функции необходимо декларировать. Формат объявления указателя на функции следующий:

тип (*переменная-указатель)(список параметров);

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

Например, объявление вида:

double (*p_f )(char, double);

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

2. Идентификатор функции считается константным указателем, поэтому для того, чтобы установить переменную-указатель на конкретную функцию, достаточно ей присвоить ее идентификатор:

переменная-указатель = ID_функции;

Например, имеется функция с прототипом: double f1(char, double); тогда операция

p_f = f1;

установит указатель p_f на данную функцию.

Идентификатор функции может быть присвоен указателю и по-другому:

double f1(char C, double D){

... // тело функции f1

}

void FunOut(double (*p_f )(char, double)){

... // тело функции FunOut

}

void main(){

... // тело функции main

FunOut(f1);

... // тело функции main

}

Здесь при вызове функции FunOut в нее передается аргумент - указатель на функцию f1, который присваивается параметру p_f .

3. Вызов функции после установки на нее указателя выглядит так:

(*переменная-указатель)(список аргументов);

или

переменная-указатель (список аргументов);

После таких действий кроме стандартного обращения к функции: