Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C.doc
Скачиваний:
29
Добавлен:
08.05.2015
Размер:
1.17 Mб
Скачать

Работа с указателями на функцию

Можно использовать также указатель на функцию. В этом случае перед функцией ставится *, а имя функции со звездочкой заключается в круглые скобки. В случае необходимости прямо перед звездочкой указывается вид указателя - 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 Кбт, в этой же модели все ограничения сняты.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]