русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

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


Дата добавления: 2013-12-24; просмотров: 974; Нарушение авторских прав


Ссылка

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

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

 

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'а сделать аргументом при вызове функции.

 

Ссылка - это не особый тип данных, а "автоматически разыменуемый" указатель, т.е. это объект, который указывает на положение другой переменной.

Ссылка - это "неявный" указатель, который отличается от обычного "явного" указателя тем, что для ссылки не нужно специально записывать операцию разадресации (она подразумевается автоматически). Над указателями возможны арифметические операции. Над самой ссылкой арифметические операции невозможны (потому что они будут истолкованы компилятором как операции над тем объектом, на который ссылается ссылка).

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

type &ID = инициализатор;

Инициализатор - это идентификатор объекта, на который в дальнейшем будет указывать ссылка. Пример:

int a = 8;

int &r = a;

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

a++;

r++;

Наиболее полезны ссылки оказываются в качестве параметров функций, т.к. значение (конкретный адрес) им тогда присваивается при вызове функции. Например, вышеприведенный пример с функцией zam тогда можно переписать так:

void zam(int &x, int &y)

{

int t = x;

x = y;

y = t;

}

 

Участок программы с обращением к данной функции:

 

void zam (int&, int&);

void main (void)

{

int a=2, b=3;

printf(" a = %d , b = %d\n", a, b);

zam (a, b);

printf(" a = %d , b = %d\n", a, b);

}

 

Использование ссылок вместо "явных" указателей никак не могло повлиять на работу функции, но упростило и синтаксис ее тела, и (что еще важнее) синтаксис ее вызова.

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

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

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. Вызов функции после установки на нее указателя выглядит так:

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

или



<== предыдущая лекция | следующая лекция ==>
Указатели как параметры функций. | Создание одномерного динамического массива.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.659 сек.