- •Введение
- •Достоинства и недостатки языка c
- •Типы данных в с
- •Модификаторы
- •Константы
- •Арифметические операции
- •Логические операции
- •Оператор присваивания
- •Организация множественных выражений
- •Комбинированные операции
- •Локальные и глобальные объекты
- •Модификатор extern
- •Статические и динамические объекты
- •Регистровые переменные
- •Описание неизменяемых объектов
- •Указатели
- •Явное преобразование типа
- •Оператор if
- •Операторы циклов Оператор while
- •Оператор do ... While
- •Оператор for
- •Оператор switch (переключатель)
- •Операторы передачи управления
- •Прототипы функций
- •Передача данных в функцию
- •Структуры и определения типов пользователя
- •Битовые поля
- •Объединения
- •Псевдофункция sizeof
- •Основные директивы препроцессора
- •Основные директивы условной компиляции
- •Дополнительные данные по Turbo-c
- •Организация памяти на машинах класса pc. Виды указателей
- •Работа с указателями на функцию
- •Основные регистры общего назначения процессора
- •Модели памяти
- •Использование стека
- •Организация прерываний в программе. Модификатор volatile
- •Порядок передачи данных в функцию. Модификатор pascal
- •Передача данных в программу. Функция main
- •Разбор типовых ошибок и недочетов при программировании
- •Некоторые функции библиотеки Turbo-c
- •Функции работы с оперативной памятью эвм
- •Функции работы с клавиатурой
- •Работа с дисплеем в символьном режиме
- •Работа с дисплеем в графическом режиме
- •Функции работы с дисками
- •Функции работы с временными интервалами и звуком
- •Функции преобразования данных
- •Функции работы со строками
- •Математические функции
- •Функции работы с файлами и каталогами
- •Функции работы со временем и датой
- •Функции процессов
- •Функции работы с портами машины
- •Интерфейс с дос
- •Задачи на практические занятия
- •Литература
- •Оглавление
Работа с указателями на функцию
Можно использовать также указатель на функцию. В этом случае перед функцией ставится *, а имя функции со звездочкой заключается в круглые скобки. В случае необходимости прямо перед звездочкой указывается вид указателя - near, far или huge.
Примеры описания:
double (*g1)(int); - указатель на функцию с именем g1, возвращающую значение типа double и принимающую параметр типа int.
int near *(far *g3)(double); - указатель типа far на функцию с именем g3, возвращающую указатель типа near на тип int и принимающую параметр типа double.
Примечание: если мы используем имя функции, то это эквивалентно использованию указателя на функцию.
Примеры использования указателя на функцию:
1. вызов перезагрузки ПЭВМ - эта функция находится в памяти по адресу f000:fff0 (шестнадцатиричный).
#include <dos.h>
main()
{
void (far *boo)(void);
boo=MK_FP(0xf000,0xfff0);
boo();
}
2. передача имени функции как параметр в другую функцию
#include <stdio.h>
int x2(int x) /* функция вычисляет квадрат величины */
{ return x*x; }
int y(int x, int yp(int))
/* функция возвращает удвоенное значение другой функции */
/* в параметрах описана функция (указатель) yp */
{ return 2*yp(x); }
main()
{
int a=3;
printf("\n%d",y(a,x2)); /* будет напечатано 18 */
}
Основные регистры общего назначения процессора
В стандартном режиме все регистры общего назначения процессора 16-тиразрядные. Назначение регистров:
AX (AH-старший байт, AL-младший байт) - аккумулятор.
BX (BH-старший байт, BL-младший байт) - база.
CX (CH-старший байт, CL-младший байт) - счетчик.
DX (DH-старший байт, DL-младший байт) - данные.
CS - сегмент кода.
DS - сегмент данных.
SS - сегмент стека.
ES - дополнительный сегмент данных.
SP - указатель стека.
BP - указатель базы.
SI - индекс источника.
DI - индекс получателя.
К регистрам общего назначения процессора можно обратиться прямо, набрав его имя, а перед ним поставив символ _, например, _AX, _AH. Их тип - целое беззнаковое.
Модели памяти
Существует шесть моделей памяти, которые определяют ограничения на количество данных в программе, на типы указателей, объем памяти, занимаемый программой и так далее. Модели памяти задаются в оболочке Turbo-C в опциях компилятора или командной строке вызова автономного компилятора. Рассмотрим эти модели:
1. Крохотная (tiny). Все четыре сегментных регистра (CS, DS, SS, ES) указывают на один и тот же адрес. Код программы и данные находятся в одном сегменте и занимают не более 64 Кбт. В программе по умолчанию используются только near-указатели. Программы могут быть переведены в COM-формат.
2. Малая (small). Программный сегмент и сегмент данных различны и не перекрываются. Итого программа может иметь размер 64+64=128 Кбт памяти. Сегменты стека и дополнительные сегменты начинаются того же адреса памяти, что и сегмент данных. В программе по умолчанию используются только near-указатели.
3. Средняя (medium). Для программы используются far-указатели, а для данных - near. В результате код программы может быть до 1 Мбт, а объем статических данных - до 64 Кбт.
4. Компактная (compact). Для программы используются near-указатели, а для данных - far. В результате код программы может быть до 64 Кбт, а объем данных (но не статических) - до 1 Мбт. Эта модель прямо противоположна средней модели памяти.
5. Большая (large). Здесь для программы и данных используются far-указатели. Модель нужна для создания очень больших программных продуктов.
6. Огромная (huge). Здесь для программы и данных используются far-указатели. Большая модель все равно ограничивает объем статических данных в 64 Кбт, в этой же модели все ограничения сняты.