Язык программирования C. Структура простейшей программы на языке C, страница 5

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

Расмотренные ранее понятия определять и описывать имеют важное значение для функций. В С существует понятие прототипа функции: это описание функции, которое объясняет, каким образом к функции надо обращаться, какие аргументы и какого типа следует ей передвать и какого типа возвражаемое значение от нее можно получить. По сути, это информация компилятору, что можно компилировать программу с где-то определенной функций – достаточно проверить лишь правильность ее вызова.

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

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

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

Функция main().

Как мы уже не раз говорили, каждая программа должна иметь функцию main(). Исполняющая среда операционной системы при запуске приложения посылает функции main() три параметра:

int main (int argc, char *argv[], char *env[])

int argc – целое, счетчик, это число аргументов командной строки, посылаемое функции main;

char *argv[] – это массив указателей на строки.

argv[0] – это полное имя запускаемой программы. (Для различных ОС и интерфейсов это имя может варьироваться см. Философия программирования для Windows NT).

argv[1] – указывает на первое после имени программы слово

argv[2] – указывает на второе после имени программы слово

argv[argc - 1] – указывает на последнее слово в списке аргументов вызова программы

argv[argc] – содержит NULL.

char *env[] – также массив указателей на строки. Каждый элемент содержит строку типа

ENVVAR = value, где

ENVVAR – это имя переменной среды, типа PATH

value – это значение данной переменной окружения.

Например, PATH = C:\;C:\DOS;

При определении функции main можно опускать аргументы (все или с конца). Функция main не требует описания, так как в явном виде вы ее не вызываете.

Символы маскирования в командной строке

Агрументы командной строки могут содержять символы маскирования (если это поддерживается используемым компилятором). При этом они могут расширяться для всех имен файлов, которые совпадают с аргументом (подобно, например, DOSовской команде copy). При этом имена всех файлов, подходящих к указанной маске, заносятся в массив argv. Максимальный размер массива строк argv ограничивается только размером памяти в куче.

1.6.  Конструкторы составных данных (массивов, структур и т.п.)

Многие языки позволяют создавать типы данных более сложные чем базисные. Для этого предусмотрены стандартные конструкторы типов данных – массивы и структуры.