Параметры командной строки функции main
В стандарте ANSI функция main возвращает целочисленный результат, т.е. используется следующим образом:
int main () {
¼
return 0;
}
здесь оператор return возвращает операционной системе код завершения функции, причем значение 0 трактуется как нормальное завершение, остальные значения воспринимаются как ошибки.
Функция main может быть определена с параметрами, которые передаются из внешнего окружения, например, из командной строки. Во внешнем окружении действуют свои правила представления данных, а точнее, все данные представляются в виде строк символов. Для передачи этих строк в функцию main используются два параметра, общепринятые (необязательные) идентификаторы которых argc и argv:
int main (int argc, char *argv[]) ...
Параметр argc имеет тип int, его значение формируется из анализа командной строки и равно количеству слов в командной строке, включая и имя вызываемой функции. Параметр argv – это массив указателей на строки, каждая из которых содержит одно слово из командной строки. Если слово должно содержать символ пробел, то при записи его в командную строку оно должно быть заключено в кавычки.
Функция main может иметь и третий параметр argp, который служит для передачи параметров операционной системы (ОС), в которой выполняется программа, в этом случае ее заголовок имеет вид
int main (int argc, char *argv[], char *argp[])
Операционная система поддерживает передачу значений для параметров argc, argv, argp, а пользователь отвечает за передачу и использование фактических аргументов функции main.
Приведем пример программы печати фактических аргументов, передаваемых из ОС в функцию main и параметров оперативной системы.
int main ( int argc, char *argv[], char *argp[])
{
int i;
printf ("\n Program Name %s", argv[0]);
for( i=1; i <=argc; i++)
printf ("\n Argument %d = %s", i, argv[i]);
printf ("\n OC parametrs: ");
while (*argp) {
printf ("\n %s", *argp);
argp++;
}
return 0;
}
Очевидно, что оформленная таким образом функция main() может вызываться рекурсивно из любой функции.
ГЛАВА 12. Классы памяти и область действия объектов
Классы памяти объектов в языке Cи
Напомним, что все объекты программы на Си перед их использованием должны быть декларированы. Операционные объекты (в частности переменные) при этом, кроме атрибута «тип», имеют необязательный атрибут «класс памяти», существенно влияющий на область и время их действия.
Класс памяти программного объекта определяет время ее существования (время жизни) и область видимости (действия) и может принимать одно из значений: auto, extern, static и register.
Класс памяти и область действия объектов по умолчанию зависят от места их размещения в коде программы.
Область действия объекта – это часть кода программы, в которой его можно использовать для доступа к связанному с ним участку памяти. В зависимости от области действия переменная может быть локальной (внутренней) или глобальной (внешней).
Имеется три основных участка программы, где можно декларировать переменные:
– внутри функции (блока);
– в заголовке функции при определении параметров;
– вне функции.
Эти переменные соответственно называются локальными (внутренними) переменными, формальными параметрами и глобальными (внешними) переменными.
Область действия локальных данных – от точки декларации до конца функции (блока), в которой произведена их декларация, включая все вложенные блоки.
Областью действия глобальных данных считается файл, в котором они определены, от точки описания до его окончания.
Если класс памяти у переменной не указан явным образом, он определяется компилятором исходя из контекста ее декларации.
Время жизни может быть постоянным – в течение выполнения программы, и временным – в течение выполнения функции (блока) программы.
Автоматические переменные
Переменные, декларированные внутри функций, являются внутренними и называются локальными переменными. Никакая другая функция не имеет прямого доступа к ним. Такие объекты существуют временно на этапе активности функции.
Каждая локальная переменная существует только в блоке кода, в котором она объявлена, и уничтожается при выходе из него. Эти переменные называются автоматическими и располагаются в стековой области памяти.
При необходимости такая переменная инициализируется каждый раз при выполнении оператора, содержащего ее определение. Освобождение памяти происходит при выходе из функции (блока), в которой декларирована переменная, т.е. время ее жизни – с момента описания до конца блока.
По умолчанию локальные объекты, объявленные в коде функции, имеют атрибут класса памяти auto.
Принадлежность к этому классу можно также подчеркнуть явно, например:
void main(void) {
auto int max, lin;
...
}
так поступают, если хотят показать, что определение переменной не нужно искать вне функции.
Для глобальных переменных этот атрибут не используется.
Регистровая память (атрибут register) – объекты целого типа и символы рекомендуется размещать не в ОП, а в регистрах общего назначения (процессора), а при нехватке регистров – в стековой памяти (размер объекта не должен превышать разрядности регистра), для других типов компилятор может использовать другие способы размещения или просто проигнорировать данную рекомендацию.
Регистровая память позволяет увеличить быстродействие программы, но к размещаемым в ней объектам в языке Си (но не С++) не применима операция получения адреса «&».