Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
GRIGOREV.DOC
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
608 Кб
Скачать
☆

1.17. Динамическое распределение памяти

Построение динамических объектов (списков, деревьев) выполняется так же, как в языке PASCAL, т.е. для этого используются структуры. Структуры могут включать в качестве элементов указатели на себя, например, элемент односвязного списка символьных строк можно описать в виде:

struct Element { char *String; struct Element *Next;};

Для распределения и освобождения динамической памяти используются функции, описанные в stdlib.h :

void* malloc(size_t r) - возвращает указатель на место в памяти, отведенное для объекта размера r ; если память недоступна - возвращает NULL;

void* calloc(size_t n,size_t r) - возвращает указатель на место в памяти, отведенное для массива из n объектов размера r ; если память недоступна - возвращает NULL;

void* realloc(void* p,size_t r) - изменяет размер объекта, на который указывает p , на r , возвращает новый указатель или NULL;

void free(void* p) - освобождает память, распределенную функциями calloc , malloc или realloc .

В С++ введены две унарные операции - new и delete - для динамического распределения памяти, освобождающие программиста от необходимости явно использовать библиотечные функции malloc, calloc и free. Операции new имя типа или new имя типа [ инициализатор ] позволяют выделить и сделать доступным свободный участок памяти и возвращают адрес выделенного места. Если память недоступна - возвращают NULL. В выделенный участок заносится значение, определяемое инициализатором, который не является обязательным элементом и представляет собой выражение в круглых скобках. Например:

point=new int(15); h=new double(3.1415); string=new char[80];

Последний оператор отводит место в свободной памяти под массив из 80 элементов типа char . Указатель string содержит теперь адрес нулевого элемента массива. Для явного освобождения выделенного операцией new фрагмента памяти используется операция delete указатель , где указатель адресует освобождаемый участок памяти. Например, операторами

delete point; delete string;

освобождаются участки памяти, связанные с указателями point и string.

1.18. Графика

Графические функции описаны в файле graphics.h . Эти функции практически полностью аналогичны процедурам и функциям модуля Graph системы Turbo Pascal, но все имена функций записываются строчными буквами, а имена констант - прописными. Некоторые отличия в вызове графических функций обусловлены свойствами языка С. Так, функция initgraph описана следующим образом:

void initgraph(int *graphdriver,int *graphmode,char *pathtodriver);

Она используется, например, так:

int gdriver=DETECT,gmode;

initgraph(&gdriver,&gmode,"D:\\TP\\BGI");

Здесь в качестве аргументов задаются адреса переменных gdriver и gmode, поскольку это выходные параметры; путь к драйверу заключается в “ ” по правилам С и вместо одного символа \ записывается пара таких символов.

1.19. Дополнительные возможности языка:

тип enum, использование командной строки, функции

с переменным числом параметров, средства консольного

ввода-вывода, системное время, случайные числа

Оператор enum в языке С предназначен для объявления переменных типа перечисление, а также для объявления именованных целочисленных констант (типа int). Оператор enum записывается в виде

enum [ имя перечисления ] { K-имя1 [ = значение1 ] , K-имя2 [ = значение2 ] , ... };

enum имя перечисления имя1 [ , имя2 , ... ] ;

Первый оператор определяет набор именованных констант, перечисленных в {}. Если какое-либо значение опущено, то оно больше предыдущей константы на 1, если опущено первое значение, то оно равно 0. Константы типа enum могут использоваться как обычные величины типа int. Второй оператор определяет переменные перечислимого типа, такие переменные могут принимать значения только из своего перечисления. Оба действия можно объединить в одном операторе. Тип enum очень похож на тип “перечисление” в языке PASCAL, но в С данные такого типа могут использоваться как обычные числа.

Функция main может иметь два параметра : количество аргументов (типа int) и массив строк-аргументов (типа char*[] ), которые позволяют ей считывать информацию из командной строки. Эти параметры обеспечивают те же возможности, что и функции ParamCount и ParamStr в языке PASCAL. Для того чтобы в программе получить аргументы, переданные через командную строку, достаточно записать список параметров функции main, например, так:

void main(int NumberOfArgs, char *Args[])

Выведем на экран аргументы, полученные программой :

for(i=0;i<n;i++) printf("\n аргумент #%d = %s",i,Args[i]);

или

for(i=1;Args[i]!=NULL;i++) printf("\n аргумент #%d = %s",i,Args[i]);

В языке С допускаются функции, число параметров которых заранее не определено. Список параметров таких функций имеет вид:

( список фиксированных параметров , ... )

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

va_start(va_list указатель,имя последнего фиксированного параметра) - инициализирует указатель на список неименованных параметров;

va_arg(va_list указатель , тип ) - возвращает очередной параметр указанного типа;

va_end(va_list указатель ); - закрывает список неименованных параметров, его использование в функции обязательно.

Функции для организации интерфейса с пользователем (аналогичные средствам модуля Crt в языке PASCAL) описаны в файле conio.h :

1) void window(int left, int top, int right, int bottom) - распределяет текстовое окно;

2) void textbackground(int color) - устанавливает цвет фона;

3) void textcolor(int color) - устанавливает цвет символов;

4) void textattr(int attr) - устанавливает цветовой атрибут;

5) void clrscr(void) - очищает окно;

6) void gotoxy(int x, int y) - перемещает курсор;

7) void _setcursortype(int cur_type) - устанавливает тип курсора, тип принимает значения: _NOCURSOR, _SOLIDCURSOR и _NORMALCUR­SOR

8) int kbhit(void) - проверяет, нажата ли какая-нибудь клавиша;

9) int putch(int ch) - выводит символ на экран;

10) int cprintf(char * формат [ , список вывода ] ) - осуществляет форматный вывод на экран;

11) int cputs(char *str) - выводит строку на экран;

12) int getch(void)

int getche(void) - читают символ с клавиатуры;

13) char *cgets(char *str) - читает строку с клавиатуры, str[0] должен содержать максимально допустимую длину вводимой строки, через str[1] функция возвращает длину введенной строки, сама строка начинается с str[2] , функция возвращает &str[2] ;

14) int cscanf(char * формат [ , список ввода ] ) - осуществляет форматный ввод с клавиатуры.

Функции, предназначенные для работы с временем, описаны в файле time.h :

1) clock_t clock(void) - возвращает процессорное время в тактах, прошедшее с начала выполнения программы; clock_t - псевдоним типа long;

2) CLK_TCK - вещественная символическая константа, равная количеству тактов процессора в секунду;

3) time_t time(time_t* timer) - возвращает время в секундах, прошедшее с 0 часов 1 января 1970 года; time_t - псевдоним типа long;

4) struct tm* localtime(time_t* timer) - возвращает структуру, содержащую дату и время, соответствующие значению переменной timer; структурный шаблон tm описан в файле time.h ;

5) char* asctime(struct tm* dt) - преобразует дату и время в символьную строку и возвращает указатель на нее.

Функции для получения случайных чисел описаны в файле stdlib.h :

1) void randomize(void) - инициализирует генератор случайных чисел, используя функцию time ;

2) void srand(unsigned seed) - инициализирует генератор случайных чисел, используя значение параметра seed ;

3) int rand(void) - возвращает случайное число в диапазоне от 0 до 32767;

4) int random(int range) - возвращает случайное число в диапазоне от 0 до range-1.

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