русс | укр

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

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

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

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


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

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


Дата добавления: 2015-07-04; просмотров: 549; Нарушение авторских прав


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

float func(int x, int y); // объявление функции func,

// возвращающей вещественное значение

float (*f_ptr)(); // описание указателя f_ptr

// на любую функцию, возвращающую

// вещественное значение

f_ptr = func; // в указателе – адрес функции func

r = func(a,b); // вызов функции func по ееимени

r = (*f_ptr)(a, b); // вызов функции func по ееадресу

В последнем случае переменной r будет присвоено значение функции, имеющей адрес f_ptr.

При работе с указателями на функции имена этих указателей обязательно заключаются в скобки. Описание

float *f_ptr();

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

Аналогично:

r = *f_ptr(a, b);

Переменной r будет присвоено значение, находящееся по адресу, возвращаемому (вычисляемому) функцией f_ptr.

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

int func (int a, int b); // функция func, возвращающая
// значение целого типа

int (*i_ptr)(); // указатель i_ptr на функцию,
// возвращающую значение целого
// типа

 

int *i_ptr(); // функция i_ptr, возвращающая
// адрес переменной целого типа

int *i_ptr[5]; // массив указателей i_ptr
//
на данные целого типа

int (*i_ptr)[5]; // указатель i_ptr на массив
//
значений целого типа

Для того чтобы правильно читать сложные декларации, необходимо помнить, что наивысший приоритет имеют круглые скобки, затем – квадратные скобки, и в конце – знак *. Чтение описаний осуществляется по правилу “изнутри наружу”: начать чтение необходимо с имени и проверить, есть ли справа от него открывающая круглая (тогда это функция) или квадратная (тогда это массив) скобка. Затем следует проверить, есть ли слева от имени звездочка – тогда это указатель, указатель на функцию или массив указателей. Потом снова проверяется наличие открывающей скобки справа и так далее. Если на какой-то стадии чтения справа встретится закрывающая круглая скобка, используемая для изменения порядка интерпретации декларации, то сначала необходимо полностью провести интерпретацию внутри данной пары круглых скобок, а затем продолжать ее справа от закрывающей круглой скобки:



char * ( * ( *c_ptr ) () ) [20];

7 6 4 2 1 3 5

1c_ptr это

2 – указатель на

3 – функцию, возвращающую

4 – указатель на

5 – массив из 20 элементов, которые являются

6 – указателями на

7 – значения типа char.

Примеры:

int *vect[5]; массив vect указателей на значения целого типа: признак типа массива имеет более высокий приоритет, чем признак типа указателя,

int (*vect)[5]; указатель vect на массив значений целого типа,

float *vect(); функция vect, возвращающая указатель на значения вещественного типа: признак типа функции имеет более высокий приоритет, чем признак типа указателя,

float (*vect)(); указатель vect на функцию, возвращающую значение вещественного типа,

double (*vect())[5]; функция vect, возвращающая указатель на массив из пяти элементов типа double.

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

 

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

int sloshenie(int a, int b);

int vychitanie(int a, int b);

int umnoshenie(int a, int b);

int delenie(int a, int b);

int ostatok(int a, int b);



<== предыдущая лекция | следующая лекция ==>
 | Int main()


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


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

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

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


 


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

 
 

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

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