Передача параметров из операционной среды.

Количество аргументов может быть любым.

envp – указатель на массив строк, которые содержат установку среды. Среда программы – это совокупность строк, которая становится доступной программе при её запуске на выполнение. Среда программы определяет особенности поведения ядра и оболочки ОС.

COMSPEC=C:\WINDOWS\COMMAND.COM – определяет местоположение в файловой системе командного процессора.

PATH=C:\WINDOWS;C:\VC;D:\MSDEV\BIN; - перечисляет все накопители и директории, в которых будет производиться поиск запускаемого на выполнение .com, .exe, и .bat файла, если он отсутствует в текущей директории.

Функция main() может возвращать целое значение с помощью оператора return. Оно передаётся в ОС. По принятому соглашению для ОС MSDOS возврат нулевого значения свидетельствует об успешном выполнении программы.

Аргументы командной строки можно задать из программной среды. Для этого надо в меню Run->Arguments задать командную строку, но в этом случае имя программы не указывается.

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

Имя функции - это указатель-константа на функцию, равный адресу точки входа, т.к. сама функция не является переменной. Но можно определить указатель на функцию и работать с ним как с обычной переменной: присваивать, размещать в масиве, передавать в качестве аргумента, возвращать как результат. Формат определения указателя на функцию: type(*name)(arg_list) где type – тип возвращаюемого функцией значения. name – имя переменной-указателя на функцию, arg_list – необязательный список аргументов.

Указатели на функции используются в следующих случаях:

1) многие библиотечные функции используют в качестве аргумента указатель на функцию.

2) Можно разрабатывать универсальные программы

3) указатели на функцию могут использоваться для косвенного вызова резидентных программ.

Как и переменные, указатели на функцию могут объединяться в массивы.

Типичным применением указателя на функцию являются так называемые системы управления меню. При выборе позиции меню ( от 1 до5 ) вызывается соответствующая функция. Указатели на каждую функцию хранятся в массиве указателей на функцию, выбор пользователя используется как индекс массива, а указатель используется для вызова функции.

#include<stdioh.h>

int difference(int,int);

int sum(int,int);

main()

{ int (*funcptr)(int,int);

int v1=20,v2=5,res;

funcptr=difference;

res = (*puncptr)(v1,v2);

printf(“%d\n”,res);

funcptr = sum;

res = (*puncptr)(v1,v2);

printf(“%d\n”,res);

}

int difference(int a,int b)

{return a-b;}

int sum(int a,int b)

{return a+b;}

В результате будет выведена сначало разность чисел 15, а потом их сумма 25

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

Функции malloc и free

malloc()

СТЭК
свободная память
раздел глоб. Перем и конст
Код програмы

void *malloc(size_t size);

void *free( void *p);

Ф-ция malloc выделяет обл памяти размером size -байт. Эта ф-ция содержится в файле stdlib.h, или alloc.h. Ф-ция malloc возвращает укзатель на начало выделяемого участка памяти. Участок выделяемой памяти <=64 кбайт. Свободная память хранится в виде списка блоков. Каждый блок содержит указатель на следующий блок, размер и само свободное пространство.

Все блоки в списке хранятся в порядке возрастания адресов в памяти, при этом послед. блок содержит указатель на первый. При запросе на память просматривать список свободных блоков, пока не обнар достаточно большой. Если размер точно такой же как нужно выделить, то он отделяется и отдаётся для пользования, если он больше то он отрезается, а оставшаяся часть остаётся в списке. Если в памяти свободного места нет то ф-ция возвращает 0.

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

Функции malloc и free

void free(void p)

Ф-ция free освобождает блок памяти, на начало которого указывает р. После этого память может быль использована в malloc.

Библиотека stdlib.h содержит ещё 2 функции для динам выделения памяти: calloc, realloc.

calloc – динимически выделяет память под массив

void *calloc(size_h memb, size_t size)

memb – число элементов массива

size – размер отдельного элемента

Возвращает либо NULL, либо указатель на начало выделеного участка памяти.

realloc – изменяет размер объекта память под который была выделена ранее. Содержимое объекта не изменяется, если объём памяти больше чем предыдущий размер объекта и наоборот.

void *realloc(void *ptr, size_t size)

size – новый размер

ПР: #include<stdio.h>

#include<stdlib.h>

main()

{ int *p,t;

p = (int )malloc(40*sizeof(int));

if(!p){printf(“Нехватает памяти\n”);

exit(1);}

for(t=0;t<40;t++) *(p+t)=t;

- - -

for(t=0;t<40;t++);

printf(“%d\n”,*(p+t));

free(p);

}

Наши рекомендации