Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpory_si.docx
Скачиваний:
33
Добавлен:
25.09.2019
Размер:
205.61 Кб
Скачать
  1. Аргументы функции main(): argv и argc.

Функция, которой передается управление после запуска программы, должна иметь имя main(). Она может возвращать значение в вызвавшую систему и принимать параметры из внешнего окружения. Возвращаемое значение должно быть целого типа. Стандарт предусматривает 2 формата функции:

тип main(){/*…*/}

или

тип main(int argc, char*argv[]){/*…*/}

При запуске программы параметры разделяются пробелами. Имена параметров в программе могут быть любыми, но принято использовать argc и argv.

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

Argv является указателем на массив указателей типа char. Каждый элемент массива содержит указательна отдельный параметр командной строки, хранящееся в виде С-строки, оканчивающейся null-символом.

Первый элемент массива argv[0] ссылается на полное имя, запускаемого на выполнение файла.

Следующий argv[1] указывает на первый параметр; argv[2] – на второй и т.д. Параметр argv[argc] должен быть равен 0. Если функция main() ничего не возвращает, вызвавшая система получит значение,

означающее успешное завершение. Ненулевое значение означает аварийное завершение. Оператор возврата из main() можно опускать.

  1. Рекурсия.

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

Прямой (непосредственной) рекурсией является вызов функции внутри тела этой функции.

int a()

{.....a().....}

Любая функция в программе на языке С может быть вызвана рекурсивно, т.е. она может вызывать саму себя. Компилятор допускает любое число рекурсивных вызовов. При каждом вызове для формальных параметров и переменных с классом памяти auto и register выделяется новая область памяти, так что

их значения из предыдущих вызовов не теряются, но в каждый момент времени доступны только значения текущего вызова.

Переменные, объявленные с классом памяти static, не требуют выделения новой области памяти при каждом рекурсивном вызове функции и их значения доступны в течение всего времени выполнения программы.

Классический пример рекурсии – это математическое определение факториала n!:

n! = 1 при n=0;

n*(n-1)! при n>1 .

Функция, вычисляющая факториал, будет иметь следующий вид:

long fakt(int n)

{

return ( (n==1) ? 1 : n*fakt(n-1) );

}

Хотя компилятор языка С не ограничивает число рекурсивных вызовов функций, это число ограничивается ресурсом памяти компьютера и при слишком большом числе рекурсивных вызовов может произойти переполнение стека.

  1. Вызов библиотечных функций.

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

в специальных заголовочных файлах, поставляемых вместе с библиотеками в составе систем программирования, и включаются в программу с помощью директивы #include.

Функции для манипулирования динамической памятью в стандарте Си следующие:

void *calloc(unsigned n, unsigned size); – выделение памяти для размещения n объек­тов размером size байт и заполнение полученной области нулями; возвращает указатель на выделенную область памяти;

void *malloc (unsigned n) – выделение области памяти для размещения бло­ка размером n байт; возвращает указатель на выделенную область памяти;

void *realloc (void *b, unsigned n) – изменение размера размещенного по адресу b блока на новое значение n и копирование (при необхо­димости) содержимого блока; возвращает указатель на перераспределенную область памяти; при возникновении ошибки, например, нехватке памяти, эти функции возвращают значение NULL, что означает отсутствие адреса (нулевой адрес);

coreleft (void) – получение размера свободной памяти в байтах только для MS DOS (используется в Borland C++), тип результата: unsigned – для моделей памяти tiny, small и medium; unsigned long – для моделей памяти compact, large и huge;

void free (void *b) – освобождение блока памяти, адресуемого указате­лем b.

Для использования этих функций требуется подключить к программе в зависимости от среды программирования заголовочный файл alloc.h или malloc.h.

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